Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On October 17 via manual from NL

Summary

This website contacted 60 IPs in 9 countries across 44 domains to perform 247 HTTP transactions. The main IP is 77.247.84.129, located in Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust TLS RSA CA G1 on July 29th 2019. Valid for: a year.
This is the only time www.golem.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 92 77.247.84.129 25291 (SYSELEVEN...)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
17 172.217.16.162 15169 (GOOGLE)
1 13.225.78.17 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
3 8 104.109.82.87 20940 (AKAMAI-ASN1)
1 1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
9 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
10 136.243.33.79 24940 (HETZNER-AS)
2 6 2.18.234.72 16625 (AKAMAI-AS)
2 3 37.157.4.40 198622 (ADFORM)
2 34.95.120.147 15169 (GOOGLE)
2 185.33.223.209 29990 (ASN-APPNEXUS)
5 35.206.134.202 19527 (GOOGLE-2)
1 2.18.234.21 16625 (AKAMAI-AS)
2 104.16.190.66 13335 (CLOUDFLAR...)
1 185.64.189.112 62713 (AS-PUBMATIC)
4 2a00:1450:400... 15169 (GOOGLE)
2 151.101.113.194 54113 (FASTLY)
11 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 116.202.11.240 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
3 148.251.131.173 24940 (HETZNER-AS)
1 2600:9000:20e... 16509 (AMAZON-02)
1 77.247.84.149 25291 (SYSELEVEN...)
6 188.40.118.169 24940 (HETZNER-AS)
2 2 172.217.21.194 15169 (GOOGLE)
1 2.16.122.151 20940 (AKAMAI-ASN1)
1 3 89.163.159.110 24961 (MYLOC-AS)
3 148.251.69.233 24940 (HETZNER-AS)
2 2 52.48.237.210 16509 (AMAZON-02)
1 1 136.243.12.39 24940 (HETZNER-AS)
2 52.216.240.6 16509 (AMAZON-02)
1 3 2a00:1450:400... 15169 (GOOGLE)
1 18.185.187.173 16509 (AMAZON-02)
3 13.224.196.120 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
1 80.252.91.53 15830 (TELECITY-LON)
2 2a00:1450:400... 15169 (GOOGLE)
1 2 199.166.0.24 7415 (ADSAFE-1)
2 2a00:1450:400... 15169 (GOOGLE)
2 199.166.0.32 7415 (ADSAFE-1)
2 104.244.36.20 7415 (ADSAFE-1)
1 62.168.44.118 5588 (GTSCE GTS...)
4 52.51.174.200 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 85.114.144.106 24961 (MYLOC-AS)
1 2600:9000:215... 16509 (AMAZON-02)
1 54.154.35.6 16509 (AMAZON-02)
1 13.224.196.116 16509 (AMAZON-02)
3 136.243.91.175 24940 (HETZNER-AS)
1 108.128.71.27 16509 (AMAZON-02)
1 148.251.2.60 24940 (HETZNER-AS)
1 2.18.232.130 16625 (AKAMAI-AS)
1 2.18.233.180 16625 (AKAMAI-AS)
247 60
Apex Domain
Subdomains
Transfer
113 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.3.damoh.golem.de
ssl.1.damoh.golem.de
2 MB
25 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
stats.g.doubleclick.net
307 KB
10 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
148 KB
10 meetrics.net
lb82.s400.meetrics.net
3 KB
9 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
7 selfcampaign.com
lib.selfcampaign.com
delivery.selfcampaign.com
track2.selfcampaign.com
track.selfcampaign.com
6 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
6 adsafeprotected.com
fw.adsafeprotected.com
static.adsafeprotected.com
dt.adsafeprotected.com
89 KB
6 googletagservices.com
www.googletagservices.com
173 KB
5 otto.de
orbidder.otto.de
726 B
5 adscale.de
ih.adscale.de
js.adscale.de
8 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
27 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
62 KB
3 google-analytics.com
www.google-analytics.com
18 KB
3 adnxs.com
ib.adnxs.com
acdn.adnxs.com
2 KB
3 adform.net
adx.adform.net
c1.adform.net
866 B
3 google.de
adservice.google.de
524 B
3 ioam.de
script.ioam.de
de.ioam.de
13 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 2mdn.net
s0.2mdn.net
52 KB
2 googleapis.com
imasdk.googleapis.com
92 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 adsrvr.org
match.adsrvr.org
908 B
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
20 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 districtm.io
dmx.districtm.io
cdn.districtm.io
416 B
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
11 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
21 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
496 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
8 KB
1 serving-sys.com
bs.serving-sys.com
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 googletagmanager.com
www.googletagmanager.com
28 KB
1 casalemedia.com
as-sec.casalemedia.com
902 B
1 google.com
adservice.google.com
171 B
1 nuggad.net
si.nuggad.net
538 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
84 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
61 KB
247 44
Domain Requested by
91 www.golem.de www.golem.de
17 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb82.s400.meetrics.net www.golem.de
8 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
7 video.golem.de www.golem.de
text
7 cpxl.golem.de www.golem.de
6 tt.onthe.io cdn.onthe.io
6 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
6 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
5 googleads.g.doubleclick.net pagead2.googlesyndication.com
5 orbidder.otto.de cdn-a.yieldlove.com
4 tpc.googlesyndication.com securepubads.g.doubleclick.net
4 ih.adscale.de 2 redirects www.golem.de
js.adscale.de
3 ssl.3.damoh.golem.de text
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 www.google-analytics.com 1 redirects www.googletagmanager.com
www.golem.de
3 track2.selfcampaign.com www.golem.de
3 adservice.google.de securepubads.g.doubleclick.net
2 uss.xplosion.de www.golem.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 dt.adsafeprotected.com www.golem.de
2 static.adsafeprotected.com www.golem.de
2 s0.2mdn.net imasdk.googleapis.com
www.golem.de
2 fw.adsafeprotected.com 1 redirects www.golem.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 s3.amazonaws.com www.golem.de
text
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 dmp.theadex.com lib.selfcampaign.com
cdn.stroeerdigitalgroup.de
2 cm.g.doubleclick.net 2 redirects
2 lib.selfcampaign.com www.golem.de
2 de.ioam.de 1 redirects www.golem.de
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
2 ads.golem.de www.golem.de
1 eu-u.openx.net cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 acdn.adnxs.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 ssl.1.damoh.golem.de text
1 adstax-match.adrtx.net cdn.adrtx.net
1 sak.userreport.com nugmw.userreport.com
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 cdn.stroeerdigitalmedia.de www.golem.de
1 bs.serving-sys.com securepubads.g.doubleclick.net
1 cdn.radiantmediatechs.com www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 d.agkn.com js.agkn.com
1 track.selfcampaign.com 1 redirects
1 delivery.selfcampaign.com lib.selfcampaign.com
1 ad.yieldlab.net www.golem.de
1 cpx.golem.de www.golem.de
1 js.agkn.com cdn.stroeerdigitalgroup.de
1 www.googletagmanager.com www.golem.de
1 cdn.onthe.io www.golem.de
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 adx.adform.net cdn-a.yieldlove.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 adservice.google.com securepubads.g.doubleclick.net
1 nugmw.userreport.com www.golem.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
1 golem.de 1 redirects
247 75
Subject Issuer Validity Valid
*.golem.de
GeoTrust TLS RSA CA G1
2019-07-29 -
2020-09-26
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-10-03 -
2019-12-26
3 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
2018-09-27 -
2019-11-26
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
*.google.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
orbidder.otto.de
Let's Encrypt Authority X3
2019-08-24 -
2019-11-22
3 months crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.selfcampaign.com
Starfield Secure Certificate Authority - G2
2018-06-28 -
2020-07-28
2 years crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-02
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2019-03-19 -
2020-03-19
a year crt.sh
bs.serving-sys.com
Go Daddy Secure Certificate Authority - G2
2018-03-08 -
2020-03-08
2 years crt.sh
*.googleapis.com
GTS CA 1O1
2019-10-03 -
2019-12-26
3 months crt.sh
*.adsafeprotected.com
COMODO RSA Domain Validation Secure Server CA
2018-08-20 -
2020-09-17
2 years crt.sh
*.doubleclick.net
GTS CA 1O1
2019-10-03 -
2019-12-26
3 months crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-10-16 -
2020-01-14
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2019-04-23 -
2020-02-19
10 months crt.sh

This page contains 25 frames:

Primary Page: https://www.golem.de/
Frame ID: 65ADD2F65470CA278C7364400B30044B
Requests: 191 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/zrt_lookup.html
Frame ID: 8149807FEB2B9619726928D86B7CBCB7
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753466&bpp=7&bdt=450&fdt=92&idt=92&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&correlator=4674202752223&frm=20&pv=2&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3946&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=a!8&fsb=1&xpc=b6SUb5MIFk&p=https%3A//www.golem.de&dtd=103
Frame ID: D54C287965D422D52B91A3674304C136
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753473&bpp=5&bdt=458&fdt=189&idt=189&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=56&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4627&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=a!9&fsb=1&xpc=sLHmEK6lDW&p=https%3A//www.golem.de&dtd=192
Frame ID: 5587D9D24B1338D698F9380FA149D44B
Requests: 1 HTTP requests in this frame

Frame: https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Frame ID: 50ECCBB2DF8768E22BCF5A3A8DE1C539
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753478&bpp=4&bdt=462&fdt=241&idt=241&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5336&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a!a&fsb=1&xpc=YouWYOCnvU&p=https%3A//www.golem.de&dtd=244
Frame ID: 6A1F1B2877A04BF87C88B04E50AAC1CA
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=252205592&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: DAFB63E16CC768C135A6945FBA9B57D0
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1571290753&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1571290753539&bpp=4&bdt=523&fdt=228&idt=228&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&nras=1&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&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=11&uci=a!b&fsb=1&dtd=234
Frame ID: 9C0F210AB0DDB5215FAD95D3ACCFF5CA
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstLMAldr1cwb4Mc_THmqyvbpJ0kugdk9OjQwMo_GrtWFwcQxNKNBWNQHULjkiVLu04EZpzhoBw4LU2fQDKKYBiJE7BYJwlL4xN1Pb-rK7jcD3KQxQahOnlUXZDL1QXgwm8BzOHJHJMIgIMZ7UT9GuQsuWLtFnOFz93SkgiIP9x43pGX6C5OQeHO3syHpfF8GHSVYmt-UUDzNgHYtAMBgBoZTTqDWPCis_t1j39dP_tdF-dPBYRrh9U3EU4f4DW1inJUboWplnfGT7X4fjJPwYs1OM5uoaSGcVwPjuv_a92vSOtUT9Rc&sai=AMfl-YT3zFQNo9hLev0-TmqdjZr-urPrgfWK7Zp2NMQPw_g1SlsAeOH62mRR0KnJzZ-EaRTWDmtXBmMDr5TgJtkiZCZwQ_EwhHM0j3cjMgpHRQ&sig=Cg0ArKJSzI3WGrGIgCeREAE&urlfix=1&adurl=
Frame ID: 15975D89C9D06C53E6ABB56F14C2FFC3
Requests: 4 HTTP requests in this frame

Frame: https://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=rsb&c=28&pli=29025839&PluID=0&w=300&h=600&ord=1565171349&ifrm=2&ucm=true&ncu=$$https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjstxnwPmuiyRx9kX4kyZU_627s1AU9wcDNKnDhGGbL7Ll-Ak8hzk90cyBv97iQVCWznF1XwQloID7-Suu0OQ2L2VZPsgkpjUS0J7OCH9WJst1MVu064vT189XX3w0Y4D5P4KkkjBPVM0kN_yORowWQDZ1mybSepB9oZcv2BHDJfBdUm8jtDyZELDHvUrmbMoUoSTwzd_XFncatpYf9AiLeLNRdvuXqpNi8prFOmMwnTZ1AnJS5cUALXABXfquqHZN52co0k5-IFbH6UacYXIH-Dmqw%2526sai%253DAMfl-YRwED3uY9IPj2NdyR2V0ejGf0-aqSCkxmnhVj-R3-5w98v0uELxa6H3RPqL0UKKSB99zUAG_9UICiy4QiacSDfL0qIKw56T-3EAjk4GJA%2526sig%253DCg0ArKJSzCIE94r__iRcEAE%2526urlfix%253D1%2526adurl%253D$$
Frame ID: 29679DFCAA0D4BC28962F3D9DD85809F
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssdmlWJkaV6TgdeFWYxdHcSw-AhEAc4dCPQqdVbCMLJZk_f7RETuwe5vjbyuIG2n5hRr1jIzhbiee0k8F83EUwSqm2ass_LjbzOz9ynWPEp8Zs5W_41Ii756JtqgQC5zv10sP2Tkzo3PmFzebZ8EZ7oYPM45l99EgHwyD_Dxt9uQBZ0iGkSKXupfPQD4zrTcA-iTizfhwe57KU9A8pLd7F7ZGUKkZvRW0GAvF6J6UtH-e2dJHLaMwWUzAf9oPvyl7A_PgU-lTtyul4Tjc-mLzd0P77tg25KcoAkI4FzTlJAtPW4CXg&sai=AMfl-YQP4IX0svkybza3r6xW0IOOWGQFkfCaKR8ozyu2gC-gdmBGHojYuzRoWZtWyuF78xVWScNYHo-f_bTAiF7pAr2USYdNJ_a6-r_lBYBKfQ&sig=Cg0ArKJSzAK5ENQqOfj7EAE&urlfix=1&adurl=
Frame ID: 9F471CE55FD7753D41631C4E5AD1B3D2
Requests: 7 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstINl2qs7FDWnffJZxFPSSgqcPDjYJBW5d3-XrpOLmhdRoknBJJsBdfjWJlndpbJ0T0rRswXO7LMw0TlA118E1LM58C0CnuKpmQgbgOdWbY413luQnxyxvZtZME8WqHb9eYA61jgXXGGL_hLylgDr49SFOQJpcyDcJ1VFxUWBXZnjf9Em5WDwIhnxEbXbq1ls_UEsNld7XyHBPp-d5cN6MIIs2_8ZVwaQu7P97AFQXevDjQXlRmtbIiumjl7ikFyHotrA_jOrmdVmz7Oymad_6ArRM4rw&sai=AMfl-YSCLSIlsxsL8Zwie4Uix8Nt8QWJqiCyTfUp2Nk1Rqc0neEE8H1wO4ew68NH0U_Ew_aGXEGs3uxtqPhBTTr9Onk4CyklojtPQGE599_gOQ&sig=Cg0ArKJSzCMugSHor2xLEAE&urlfix=1&adurl=
Frame ID: 14EA47E9DEAE0CA8DCCCF179CF573449
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstn9bwm7xD0dAKKvg7q-TcgJqL2Oltqq-ETRyfyTj6tzzW3j89hUNPuqbFKmqvVzTRdaVWTEGjBelMhL1E4oMDliGICTNt_w-1iaWyLt2vKezJ41ZySVj2s8t6sKwLn5vfMuQgxVk4Hi-0fMOz9hAGEDAOiS5RdT8f3LfAKNYkDrWqjVhDVw-p15nuoaeBN6rZF1UVlx7oXxiwPyk2Yd22kFyBQhh2XFaGRFNbqesuvuwfyPNUfTmfW76n54CeCvt3nkznXKwhJ0A8VV9JGAD_j5B1K&sai=AMfl-YQ3fw8DHZraHeJ4RbxvrICGw1eGtSQr-uXfsQZTLwgmviS9XSkykkzI2cPy95ySacE-LiZI0_CcJULzxPQuOBbXD1pBcEXFEuFXeKBdtQ&sig=Cg0ArKJSzGuxkTDowF8aEAE&urlfix=1&adurl=
Frame ID: FAB86C2C22095C4BF8E23AB85CBEB084
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssYlKNWaDFlbL_557kKxe93FXc9jaL0d0d-lpyka3VXy7NeUkH9CF9szvzjGQRt5sd4NVDzDfBeyPNZfwrlNXFW2AM8nXcMVFDjx-UhYDuz3WG-3Z1U5plYaFcHJUCj0_o-yzZlyPvXqdlSxAfYijTH2k5LC_OJWLkH-WZxOkfTGshZ6tV6JX102Rmi8v3-yOKMSvVl_aOwjdltpC6N-wFQVe-0rapfvKS4b2YFNS7Y3wHAbm8bLyUHAASSbUtuErkbaHN7erpNtvEd8sWPIdsEsUYC&sai=AMfl-YRDCFABP845CfTr8aQftgmbY4eofuAdhZQ5oOOzuLK7IWy04sJNbstTSQx_IL3u2t4ylp1VP9zkgDJrkVVWmGKXWU85hzgJFkPu-eJzpg&sig=Cg0ArKJSzGhxWj7w2YpCEAE&urlfix=1&adurl=
Frame ID: 3651C4948447FDD43582CBF0486B2545
Requests: 9 HTTP requests in this frame

Frame: https://www.golem.de/microsite/syseleven19/metakube/index.shtml
Frame ID: 3999347D1A043741D11695216D034032
Requests: 19 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.342.1_de.html
Frame ID: B5C3AB972E10F0695C50A1B7A59D2507
Requests: 1 HTTP requests in this frame

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

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

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

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

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

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

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

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

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

Screenshot


Page URL History Show full URLs

  1. http://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Detected technologies

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

Page Statistics

247
Requests

100 %
HTTPS

29 %
IPv6

44
Domains

75
Subdomains

60
IPs

9
Countries

3363 kB
Transfer

6762 kB
Size

25
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. http://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 24
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 25
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Request Chain 64
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&i3=00131280b4dc4fce95da7fe81%3A1597556353510%3A1571290753510%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1571290753510&n1=2&dntt=0&lt=1571290753511&ev=&cs=48b8a9&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&i3=00131280b4dc4fce95da7fe81%3A1597556353510%3A1571290753510%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1571290753510&n1=2&dntt=0&lt=1571290753511&ev=&cs=48b8a9&mo=1&sr=71
Request Chain 127
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=3fa1459893034302b51d3bccf06c74de HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b302346b0322fd916af0223f63c2321d&userId=adscale-user:3fa1459893034302b51d3bccf06c74de
Request Chain 128
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=b302346b0322fd916af0223f63c2321d
Request Chain 129
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 130
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=b302346b0322fd916af0223f63c2321d
Request Chain 134
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b HTTP 302
  • https://track.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
Request Chain 135
  • https://c1.adform.net/serving/cookie/match?party=1173 HTTP 302
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=1218937380103331980&source=adform
Request Chain 150
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=553138793&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=IAhAAUAB~&jid=733688719&gjid=320221929&cid=2062521108.1571290753&tid=UA-518800-2&_gid=1182937729.1571290754&_r=1&gtm=2ouaa0&z=884029694 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
Request Chain 190
  • https://fw.adsafeprotected.com/rfw/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSitelist0108201931102019AdgapId01980018340071953001/?ftx=&fty=&ftadz=&ftscw=&ft_custom=&ftOBA=1&ft_agentEnv=0&ft_referrer=https%3A%2F%2Fwww.golem.de%2F&cachebuster=907575.2704937905&adsafe_url=https%3A%2F%2Fwww.golem.de%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:5ff2a8b9-e983-0400-e1af-e122889aea10,c:rhspcW,sl:na,em:true,fr:true,mn:app39ami,pt:1-5-15,br:u,abv:na,an:n,fm:rF8jSdz+1111|1112|12|1311|1312|1411|1412|15|161|17|18|19|1a11|1b*.306581-37675975|1c|1d|1e|1f|1g,idMap:1b*,pl:,rend:0,renddet:na,rmeas:0,es:0,sc:1,ha:1,gm:0,tt:rjss,thd:1,et:46,oid:73e2d5b9-f0a0-11e9-8a26-70106fb72ed4,v:19.8.22,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 222
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBS7ZBiR0WiRZWSUkWsfABifABSfABSfABifABifABfrr&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=4206909570601015878

247 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://www.golem.de/
188 KB
43 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d044364d3994327174d8bc935b98c4baf5361060fead44cc6a27e14feaffd885
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

Request headers

Host
www.golem.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
none
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Server
nginx
Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_74; expires=Thu, 17-Oct-2019 17:39:12 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-fa6d97bea0ade7de1935727c213d5af9"
Content-Encoding
gzip
Vary
Accept-Encoding
X-UPSTREAM
unix:/var/run/php-fpm-www.sock

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_130-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_130-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 05 Jun 2019 18:13:08 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
250 KB
61 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
fe495e0b91849474ec20925ae0c6627f35951a593488029e39a4474e826222e7

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
vary
Accept-Encoding
x-amz-request-id
20AB3B01FB701488
status
200
content-length
61684
x-amz-id-2
BNstaJLtOcnq1DibUqfKIHMDmHiNNy2KWb/eN+5OvI/9t5l3+wE7bt2StsEMWXBgnY8Gs2Pdv3s=
last-modified
Wed, 16 Oct 2019 15:09:49 GMT
server
KONICHIWA/1.0
etag
"5cd1582cfddd278c0939a81ac9ee2b5c"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=746
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144193-210380-210378_rc.jpg
www.golem.de/1910/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1910/144193-210380-210378_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d4f303e0babff67a0349a523737b9246c64ab003bf0e3c3fa0dee61bf0213943

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 10:02:03 GMT
Server
nginx
ETag
"5da6ea9b-5b77"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23415
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144463-211670-211667_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144463-211670-211667_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e40c0cd11a909101b6ab6831fa77a7546ec04e2e26589d8360469a05c46331d4

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 20:46:03 GMT
Server
nginx
ETag
"5da7818b-1866"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6246
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144454-211623-211620_rc.jpg
www.golem.de/1910/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144454-211623-211620_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b12b6d9365e6da88095ec8ae15ccb7d5c74590f7216bf99ef165aaa872240e61

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 11:53:03 GMT
Server
nginx
ETag
"5da7049f-20de"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8414
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144461-211661-211658_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144461-211661-211658_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7c233780d8af4e9750d9c34694f3c1f2138a519d796a07778616edb176dd0933

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 15:44:03 GMT
Server
nginx
ETag
"5da73ac3-1a67"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6759
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144458-211643-211640_rc.jpg
www.golem.de/1910/
10 KB
11 KB
Image
General
Full URL
https://www.golem.de/1910/144458-211643-211640_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
10da54dd1f260713cd4238f6c9ea0d057d74424fb4ef30fd3334c4f3cbdad3be

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 13:42:03 GMT
Server
nginx
ETag
"5da71e2b-29e5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10725
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144192-210377-210376_rc.jpg
www.golem.de/1910/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144192-210377-210376_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
04b305e567c7dd92c120d01f01efed4fdf3fd001084790a10d128adf5b39b152

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 08:13:04 GMT
Server
nginx
ETag
"5da6d110-1d84"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7556
Expires
Sun, 17 Nov 2019 05:39:13 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1571290743&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
799
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
tesla-zeigt-crashtest-des-model-3-(herstellervideo).jpg
video.golem.de/teaser/1/1/23648/thumb-high-1000/
83 KB
83 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23648/thumb-high-1000/tesla-zeigt-crashtest-des-model-3-(herstellervideo).jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b29630448d7b1a86c9b8f753755e2a71ab64f267281af13ea63c027ef0c688bc

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:17:41 GMT
Server
nginx
ETag
"5da6e035-14c83"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
85123
Expires
Sun, 17 Nov 2019 05:39:13 GMT
terminator6-snap.jpg
video.golem.de/teaser/1/1/23623/thumb-high-1000/
68 KB
69 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23623/thumb-high-1000/terminator6-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4f607e9d4a5431d92e6ec18f98ee5504404534fa16eca7c0d80a9eb99fb2088a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 09 Oct 2019 06:39:34 GMT
Server
nginx
ETag
"5d9d80a6-110e6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
69862
Expires
Sun, 17 Nov 2019 05:39:13 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1571289841&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
798
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
144382-211301-211300_rc.jpg
www.golem.de/1910/
123 KB
123 KB
Image
General
Full URL
https://www.golem.de/1910/144382-211301-211300_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b9c5b99711415ae2d2a71942369d0fbcbfa834e364571e33453d05fba350b4be

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Fri, 11 Oct 2019 10:30:03 GMT
Server
nginx
ETag
"5da059ab-1eb5d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
125789
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144375-211265-211262_rc.jpg
www.golem.de/1910/
74 KB
74 KB
Image
General
Full URL
https://www.golem.de/1910/144375-211265-211262_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8febd28d962604aa65b1ff06abc1d5fd75919d8e0db613e2a3357d429a152031

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Fri, 11 Oct 2019 07:11:04 GMT
Server
nginx
ETag
"5da02b08-12847"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
75847
Expires
Sun, 17 Nov 2019 05:39:13 GMT
190923-golem_Seminar_Zeitmanagment_h.jpg
www.golem.de/_img/
295 KB
295 KB
Image
General
Full URL
https://www.golem.de/_img/190923-golem_Seminar_Zeitmanagment_h.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1154351398f442cae61c3f7a25a0816b6fbc252ce3d6cd93ef9e1a95531c977f

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 23 Sep 2019 19:57:57 GMT
Server
nginx
ETag
"5d8923c5-49baf"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
301999
Expires
Sun, 17 Nov 2019 05:39:13 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
longread-swiper_131-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_131-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:10 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
576 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
unix:/var/run/php-fpm-www.sock
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 26 Jul 1997 05:00:00 GMT
sdcv.js
ads.golem.de/
63 B
402 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Sun, 17 Nov 2019 05:39:13 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0013
Resource Hash
df11255dcd08e3c8b1365ad3c28377acb1ae7ae75a0148720688bdac56a1ed0d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0013
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, 17 Oct 2019 07:39:13 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
45 KB
15 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
85fc83e2f6c3879999dfb9d0fb6134aa8ef31514e5d6b40fd4ec73c4ca92968e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"309 / 11 of 1000 / last-modified: 1571261169"
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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14541
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
274 KB
84 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.17 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-17.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
bcbc1076c3a9bbc1c5d9ddecf15ae98100afec5266604d053e959ec6a345ae19

Request headers

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

Response headers

date
Thu, 17 Oct 2019 04:59:43 GMT
content-encoding
gzip
age
2353
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
trtFC-G4Vy4u-kepLjsaXfE50HPz-uCZxKkPCFRoK35BtqcOB-QkqA==
via
1.1 71dbd5706c5b0c7b733248e1171f2d4f.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Thu, 17 Oct 2019 07:39:13 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
598 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
1546b552377b93c37717ca60bc326dcce66ae9b423cb3e8b101b632451cb63d4

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 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.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
106

Redirect headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.golem.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/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
  • https://nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:b800:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
5245051f3bf3eb34dda11c762c66f8730aeb7af0c5edb5939d2cd58a0ca6b835

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
via
1.1 24475cc722041223cf99f56b55432566.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1826
x-amz-cf-id
NGbR-h9gZdKtFiYPCtnIPU7sfrTgkRTFNQsv9Hhy_P5BSQGIjrLgmw==

Redirect headers

date
Thu, 17 Oct 2019 05:39:13 GMT
via
1.1 436c247027acc191b22ece964efbaeca.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
e3yEr1P_-QPGGVDsG0GVqJuftESmz7DF590VsVBJAAVTXfRqRDz5wA==
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Sun, 17 Nov 2019 05:39:13 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Sun, 17 Nov 2019 05:39:13 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Sun, 17 Nov 2019 05:39:13 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

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/svg+xml
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

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/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Sun, 17 Nov 2019 05:39:13 GMT
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

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/svg+xml
truncated
/
147 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f

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/svg+xml
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

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/svg+xml
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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.golem.de
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58949
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
submit
lb82.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb82.s400.meetrics.net/bb-mx/submit?/BXZRBGAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwS+GBPAAAAAAAAAOAAAAGBAAAAAAZwS+GBBRksFAQtjFMS2qSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Thu, 17 Oct 2019 05:39:12 GMT
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRCGAAATkzFARksFAQtjFfqJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:12 GMT
nuggad
ih.adscale.de/
49 B
482 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=5&d4=6&d11=0&d8=2&d9=2&d12=1&d1=1&d3=5
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Thu, 17 Oct 2019 05:39:13 GMT
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Mon, 14 Oct 2019 13:25:45 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Fri, 18 Oct 2019 05:39:13 GMT
btn-follow-sp4b.png
www.golem.de/staticrl/images/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4b.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/staticrl/styles/golem_main_130-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 08 Apr 2019 18:48:10 GMT
Server
nginx
ETag
"5cab976a-b0e"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Sun, 17 Nov 2019 05:39:13 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
103 KB
36 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0b83c09854b3faab77b781ee6af48f40c63d67c4f6cb94cabdf7aae01708fe12
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 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-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
36791
x-xss-protection
0
server
cafe
etag
14609142808532303739
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Thu, 17 Oct 2019 05:39:13 GMT
golem_csi-121-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-121-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
/
adx.adform.net/adx/
10 B
407 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWY1ZWFkNDllLTc0YjktNDY2Ni1hYmRjLTM0OWEzZWI0MGYxZg%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPTYzY2U2MjE1LWIyZGMtNGI0Ni05ODNmLTZmOGM2Mjc5MDk4Mw%3D%3D&pt=gross&stid=2338bfc5-c696-4e18-9381-db90e8c2c73f&fd=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.40 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:13 GMT
server
nginx
status
200
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
content-length
10
expires
-1
arj
yieldlove-d.openx.net/w/1.0/
10 KB
11 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=b5bd8b72-6825-4562-b38b-98a856b7cb36%2Cf5ead49e-74b9-4666-abdc-349a3eb40f1f%2C08957a53-3bec-4078-9094-e540bdd29a25%2C63ce6215-b2dc-4b46-983f-6f8c62790983%2C080ea5af-47f0-40e1-8c41-ed52f5db9172&nocache=1571290753392&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner%2Cbillboard2&auid=540523394%2C540523392%2C540523393%2C540523387%2C540651907&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash
bb1e75f1c4466db6b292509996b6a61ecd7ce1e82dcec81cdcac205a458b49df

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:13 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.golem.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
10747
expires
Mon, 26 Jul 1997 05:00:00 GMT
prebid
ib.adnxs.com/ut/v3/
495 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
d87e21f6043884b3c8c479531f55ec110fedaa9879ac139c2a72773b09998ed9
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:15 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.55:80
AN-X-Request-Uuid
c4666cf5-d714-4915-b9ec-f628e28afcfb
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
495
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
146 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
strict-transport-security
max-age=15724800; includeSubDomains
cygnus
as-sec.casalemedia.com/
25 B
902 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=335654&v=7.2&r=%7B%22id%22%3A%22218e07ed9cb1b5d%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2222c88f905b8c7c9%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22335654%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%22236e706451f075c%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2224c638b4c18e275%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2225b7709a3e703d7%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2226a6a495afd907b%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%222713479c052736a%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22286dd76fb06879d%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2229e141bf3fa2e7b%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2230003d9119560fc%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2231b827beb2b7c05%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22326a9701a51ae45%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22334dfd713e9b4ed%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.21 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
2685d1e4e2343fcdf261a63df17cad548cd0452c75eca62b62a003a37abaf392

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
45
Expires
Thu, 17 Oct 2019 05:39:13 GMT
v1
dmx.districtm.io/b/
0
416 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
application/json

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
cf-cache-status
DYNAMIC
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
526fee499f38d6fd-FRA
access-control-allow-headers
origin, content-type
translator
hbopenbid.pubmatic.com/
0
114 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-Type
text/plain

Response headers

status
204
date
Thu, 17 Oct 2019 05:39:13 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
ads
securepubads.g.doubleclick.net/gampad/
81 KB
16 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=12599419205633&correlator=669847447326201&output=ldjh&impl=fifs&adsid=NT&eid=21063636&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C800x450%7C580x500%7C580x360%7C42x31%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17298.default%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17295.default%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17299.default%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cas%3Dbillboard2%26adslot%3Dbillboard2%26pc%3D1%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A18494.default%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17300.default%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3Db302346b0322fd916af0223f63c2321d%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-1%252Cn19-2%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-5%252Cn137-0%252Cn101-1%252Cn108-0%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-0%252Cn160-1%252Cn107-1%252Cn21-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-0%252Cn23-1%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-0%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-1%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-1%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-0&cookie_enabled=1&bc=31&abxe=1&lmt=1571290753&dt=1571290753415&dlt=1571290753016&idt=312&frm=20&biw=1585&bih=1200&oid=3&adxs=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adys=-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933%2C-12245933&adks=3761801772%2C2546325955%2C2740773112%2C366944190%2C3564596220%2C2251274322&ucis=1%7C2%7C3%7C4%7C5%7C6&ifi=1&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=34&icsg=243312703&std=0&csl=340&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x0%7C1000x0%7C300x0%7C1000x0%7C1000x0%7C300x2&msz=10x40%7C20x10%7C10x20%7C20x10%7C800x450%7C10x10&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&fws=128%2C128%2C128%2C128%2C128%2C128&ohw=0%2C0%2C0%2C0%2C0%2C0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
199f635f74f535f28731dd7d665b9ea95a31f07e0453e3913d04c126e4f3a8e4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-2,-2,-2,-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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
16080
x-xss-protection
0
google-lineitem-id
5182366062,5133457191,5193905688,4980490284,-2,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138288744881,138277152612,138290413938,138263655552,-2,138267872671
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019100301.js
securepubads.g.doubleclick.net/gpt/
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

gx-ads.js
ads.golem.de/track.ads/
226 B
566 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=743792062410666&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Sun, 17 Nov 2019 05:39:13 GMT
config.js
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
40 KB
9 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
81140620cdd8bea6d133e77c475b524d1e2558c0f185ee35cc151e1d653e05b3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Age
3083
X-Cache
HIT
Connection
keep-alive
Content-Length
8942
x-amz-id-2
i8HArGONWzKkAku5xpKeekkJipTRcba0k0fiSwnEeU0cHbL01Nez/9aSddYtiV1Uq8Bu3p7jWn4=
X-Served-By
cache-hhn4064-HHN
Last-Modified
Thu, 17 Oct 2019 03:39:26 GMT
Server
AmazonS3
X-Timer
S1571290753.474854,VS0,VE0
ETag
"1d6ed4a76d99919ae7982cef9c872fdf"
x-amz-request-id
5E652772CEDD59DD
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
194
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/
238 KB
88 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
1a58095266eb45b55188805f4507e88c0fa62d1fc111b67585e98a9f8b1c4e4e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 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-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
89450
x-xss-protection
0
server
cafe
etag
530792698881188819
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 17 Oct 2019 05:39:13 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/ Frame 8149
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 15 Oct 2019 14:46:35 GMT
expires
Tue, 29 Oct 2019 14:46:35 GMT
content-type
text/html; charset=UTF-8
etag
8648543205226238674
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7402
x-xss-protection
0
cache-control
public, max-age=1209600
age
139958
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",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
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201910111253/
28 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201910111253/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
92d1994cace793adb74ca4a9e69eb746448b20aac8fd7124b03fb95694761187

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Age
880
X-Cache
HIT
Connection
keep-alive
Content-Length
10742
x-amz-id-2
kHvQdjU9K3tw57zRbvA0CFASWURCDBv2xszX+r1ssMti4d2cvZKj8bmIfbdOZGd6N7H4IHtBgW0=
X-Served-By
cache-hhn4064-HHN
Last-Modified
Mon, 14 Oct 2019 17:55:56 GMT
Server
AmazonS3
X-Timer
S1571290754.501905,VS0,VE0
ETag
"3c1cf1e98c0364f9ee211400c245f9b9"
x-amz-request-id
6112BDBA1F40F610
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
1329
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&i3=00131280b4dc4fce95da7fe81%3A1597556353510%3A1571290753510%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1571290753510&n1=2&dntt=0&lt=1571290753511&ev=&cs=48b8a9&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0025
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0013&i2=00131280b4dc4fce95da7fe81&ep=1598197471&vr=415&id=sxnjyl&i3=00131280b4dc4fce95da7fe81%3A1597556353510%3A1571290753510%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1571290753510&n1=2&dntt=0&lt=1571290753511&ev=&cs=48b8a9&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Wed, 17 Oct 2018 05:39:13 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
72 KB
27 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
116.202.11.240 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.240.11.202.116.clients.your-server.de
Software
nginx /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:31:59 GMT
Server
nginx
ETag
W/"5c7d1abf-11e36"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Sat, 28 Sep 2019 10:51:02 GMT
js
www.googletagmanager.com/gtag/
74 KB
28 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
96036061db82cbb085d2434ec1d09dac9987070bc69ac0722fc9b5f91d1b521b
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
br
last-modified
Thu, 17 Oct 2019 03:00:00 GMT
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
28462
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
146005_67aa4bdf07fc8a6dd839add1ec7302a1
lib.selfcampaign.com/tag/
10 KB
4 KB
Script
General
Full URL
https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
814d8a0c1b15c12c98b8057d9c6dcaa36849084eff5002454d2465befd37e185
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
nginx/1.14.0 (Ubuntu)
Transfer-Encoding
chunked
Content-Type
text/javascript; charset=utf-8
X-Request-Id
168b7597-7785-46f1-a313-ef468108a42b
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Connection
keep-alive
Vary
Accept-Encoding
X-XSS-Protection
1; mode=block
X-Runtime
0.021080
Expires
Fri, 01 Jan 1990 00:00:00 GMT
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:ee00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

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

Response headers

date
Thu, 11 Jul 2019 15:47:45 GMT
via
1.1 2ec3090d74e200e4acdb2780da3c3c44.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
49795
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
-jNc1pOUww_1IWlfYwIc2yKDUNZbvkhmsWtCUcDo8C3b5p4co29jqw==
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n19=2&n121=2&n116=0&n104=1&n15=1&n155=1&n106=1&n52=2&n153=1&n11=1&n120=2&n154=1&n125=1&n8=5&n137=0&n101=1&n108=0&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=1&n107=1&n21=1&n117=2&n86=0&n147=4&n64=0&n119=1&n18=1&n161=1&n126=1&n92=2&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=0&n12=6&n141=0&n157=0&n99=1&n128=2&n118=6&n85=1&n9=0&n23=1&n6=2&n63=0&n58=1&n38=2&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=3&n90=0&n43=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=1&n91=0&n46=1&n114=1&n69=0&n10=1&n3=1&n82=1&n33=1&n84=1&n5=5&n109=0&n122=1&n67=0&n115=1&n89=2&n123=2&n17=1&n78=0&n44=1&n81=1&n88=1&n39=1&n156=1&n148=0
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
4f62b577f2c8c16a3db499d50478c468dc84a8336f70c0602671d48c31f8a4aa

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1517
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
crg9-snap.jpg
video.golem.de/teaser/1/1/23641/thumb-high-1000/
144 KB
144 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23641/thumb-high-1000/crg9-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0703192ee0216c94d21b7137a2fc4ff2087866ce61a5b38f07a6832144f81463

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 14 Oct 2019 08:24:44 GMT
Server
nginx
ETag
"5da430cc-23f42"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
147266
Expires
Sun, 17 Nov 2019 05:39:13 GMT
cinema-4d-demo-reel-2019-(maxon).jpg
video.golem.de/teaser/1/1/23642/thumb-high-1000/
122 KB
123 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23642/thumb-high-1000/cinema-4d-demo-reel-2019-(maxon).jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d41913f07b517a14c9a356c9eb549f53ca0ef54bc6ee6cdecd4f029f646be36b

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 14 Oct 2019 08:40:50 GMT
Server
nginx
ETag
"5da43492-1e95c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
125276
Expires
Sun, 17 Nov 2019 05:39:13 GMT
pixel4-snap_1.5.1.jpg
video.golem.de/teaser/1/1/23643/thumb-high-1000/
80 KB
81 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23643/thumb-high-1000/pixel4-snap_1.5.1.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
dcb51642ff64569b990436c6b1eff0458a639569ff473d33524893163a4f1abf

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 14 Oct 2019 14:53:45 GMT
Server
nginx
ETag
"5da48bf9-141f4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
82420
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144460-211657-211654_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144460-211657-211654_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a47575333ae39a4602b37cd9f5c1441781bad632beb4d53cc60bfd0d4d014f3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 14:29:02 GMT
Server
nginx
ETag
"5da7292e-150a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5386
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144459-211653-211649_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144459-211653-211649_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fc5df1ee401a9bc520ead88b4f22e39f12f20d2a6f8ac865424b5fb37e9c1bab

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 14:09:03 GMT
Server
nginx
ETag
"5da7247f-1721"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5921
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144451-211614-211611_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144451-211614-211611_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
eb400996751157f4090045586d4c62b5b4eefa713b9633742e48f09421bc8cf1

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 10:55:03 GMT
Server
nginx
ETag
"5da6f707-1661"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5729
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144373-211260-211257_rc.jpg
www.golem.de/1910/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144373-211260-211257_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6be470af0f571c15a41117fa40ce97339adce5d11844b6643af2c6985ea7bd1

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 06:10:03 GMT
Server
nginx
ETag
"5da6b43b-19be"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6590
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144456-211635-211632_rc.jpg
www.golem.de/1910/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144456-211635-211632_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1a17f3d4340500d4af7ac53fafb237b77d6b5cb9257fd7e042cdddf638208fbc

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 13:17:04 GMT
Server
nginx
ETag
"5da71850-18dc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6364
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144442-211585-211584_rc.jpg
www.golem.de/1910/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144442-211585-211584_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
df3a45bc8057dd992a9f90de32edc35e087fb94a0ff77cd095c6843a64335d81

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:13:03 GMT
Server
nginx
ETag
"5da6df1f-10c2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4290
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144424-211488-211485_rc.jpg
www.golem.de/1910/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1910/144424-211488-211485_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f486fb868d59a8ad6c09b3e94d2dec83dfa05534102d821dbc5a62b2c11990c8

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 08:32:04 GMT
Server
nginx
ETag
"5da58404-edf"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3807
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144457-211639-211636_rc.jpg
www.golem.de/1910/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144457-211639-211636_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
32cd82ff718382b0b99fc856d2e208c3e8f28bcbea8eb0893a55a3831b5bb4f9

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 12:58:03 GMT
Server
nginx
ETag
"5da713db-1d6f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7535
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144418-211463-211461_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144418-211463-211461_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
21370ec310568c610e252ca1d5372b659efd87e28eb6fe953501d8bb37ac5f07

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 15:00:07 GMT
Server
nginx
ETag
"5da5def7-1a1c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6684
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144439-211558-211555_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144439-211558-211555_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fede6818c6263dd5c9416e54bafb4c708a486e06452e38943301cc02dbae6a70

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 15:20:04 GMT
Server
nginx
ETag
"5da5e3a4-1392"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5010
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144455-211631-211628_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144455-211631-211628_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c6612fd7ee3032ba2bf75d467975737ce001a6d4b811e2bc796fd59edd95d1f3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 12:43:03 GMT
Server
nginx
ETag
"5da71057-1b16"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6934
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144428-211511-211510_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144428-211511-211510_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
776ce395ae8b51da0c4260911b9f77f9c262f63f72bf7feb976033a5cd9428fa

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 09:45:03 GMT
Server
nginx
ETag
"5da5951f-2439"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9273
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144436-211550-211547_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144436-211550-211547_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a349cbfc251b00bba5cd212aaa719f501d746ba47c068873d8ad0f5aaaa58cf9

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 14:11:04 GMT
Server
nginx
ETag
"5da5d378-1bd3"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7123
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144392-211396-211395_rc.jpg
www.golem.de/1910/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144392-211396-211395_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
eb2d4c1eaafe682ff6812116e38b14e93c8e4e460a54d3d4c06427b06f3617c3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 14 Oct 2019 10:00:04 GMT
Server
nginx
ETag
"5da44724-1e5c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7772
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144453-211627-211624_rc.jpg
www.golem.de/1910/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144453-211627-211624_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac06202496e2898299b18f6ef6b1ed44d07e7d60e9f59823c4377390c72de829

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 12:18:03 GMT
Server
nginx
ETag
"5da70a7b-21ac"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8620
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144426-211496-211493_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144426-211496-211493_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
240cb0975add4519885f680e0cd751e67858dd02b3fbc36c48f30f25ce13edc3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 08:47:03 GMT
Server
nginx
ETag
"5da58787-2295"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8853
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144452-211619-211618_rc.jpg
www.golem.de/1910/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144452-211619-211618_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e6432d889ce2c16ba3f0a8055e28e63d2b1c457a0664cd6030cdf9c02e21ac1d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 11:17:03 GMT
Server
nginx
ETag
"5da6fc2f-1df0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7664
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144435-211546-211543_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144435-211546-211543_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b79fac74aafdb97b28a21685ad9d73f2b44d0301c0320446316f8a8bec3707c4

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 13:03:03 GMT
Server
nginx
ETag
"5da5c387-23ff"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9215
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144450-211610-211607_rc.jpg
www.golem.de/1910/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144450-211610-211607_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c11697a9a07f45b6fa8cf484a57f6421cdd9a0cfc36380ff167ffba229baa811

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 10:40:03 GMT
Server
nginx
ETag
"5da6f383-1ce7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7399
Expires
Sun, 17 Nov 2019 05:39:13 GMT
143527-207047-207044_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/143527-207047-207044_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1100871da6b19471ab46e147ae29a0559391d5469fa7777c4c91f3d50186d666

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 10:02:05 GMT
Server
nginx
ETag
"5da5991d-155b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5467
Expires
Sun, 17 Nov 2019 05:39:13 GMT
143420-206525-206522_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/143420-206525-206522_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e4622cefb313ecfd3bbf5345548461f8b74b1c3c60303fa6d695172b5db5ac8e

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 14 Oct 2019 07:00:05 GMT
Server
nginx
ETag
"5da41cf5-1a2e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6702
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144447-211598-211597_rc.jpg
www.golem.de/1910/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144447-211598-211597_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
550079eccef4f1087ec3d08253adffc27f37d7199a37b50456efab90dbeb72b2

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 10:25:04 GMT
Server
nginx
ETag
"5da6f000-210b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8459
Expires
Sun, 17 Nov 2019 05:39:13 GMT
143431-208147-208144_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/143431-208147-208144_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
353c659732155dd281ceb0c78f48b4f4335f20c0cf6c8b29a1b956823696c93b

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Oct 2019 07:00:06 GMT
Server
nginx
ETag
"5da56e76-1ba3"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7075
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144448-211602-211599_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144448-211602-211599_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9ea1703e650d183c65658dae4ad441f1a38d4060909766b10bea3a5977ab5157

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:55:03 GMT
Server
nginx
ETag
"5da6e8f7-220d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8717
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144449-211606-211603_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144449-211606-211603_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d58f4fa84c1cd57dd2c0125ab00b84e67e750cf7df09f6d1bd449027894add5

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:49:04 GMT
Server
nginx
ETag
"5da6e790-140b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5131
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144446-211593-211590_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144446-211593-211590_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
155ecec0a4fd0c4717e00ebea223b8f0db749cb4188da00184124778c334ae59

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:43:03 GMT
Server
nginx
ETag
"5da6e627-1a7b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6779
Expires
Sun, 17 Nov 2019 05:39:13 GMT
144445-211580-211577_rc.jpg
www.golem.de/1910/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144445-211580-211577_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
767dea23d81a755d4ed641c33213274791f62289df03379e87acfc2667ab98dd

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 16 Oct 2019 09:00:04 GMT
Server
nginx
ETag
"5da6dc14-19d6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6614
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144317-211139-211137_rc.jpg
www.golem.de/1910/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144317-211139-211137_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b4f80f496f00767f67a9cd2636a89969c670c1ba2cca9895a4ace8508b9f39f5

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Thu, 10 Oct 2019 10:06:05 GMT
Server
nginx
ETag
"5d9f028d-5401"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21505
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_141848-205483-205481_rc.jpg
www.golem.de/1910/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1910/sp_141848-205483-205481_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
51f85281f32afbfbb77ddd51c2ce831c30479260b6ac45e53581d99a26e6bf2e

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 09 Oct 2019 10:05:05 GMT
Server
nginx
ETag
"5d9db0d1-571f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22303
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144319-211110-211108_rc.jpg
www.golem.de/1910/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144319-211110-211108_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
eea98e96806aae56eab20d87b93d94856191cdf7656a9f37c983159604e3d142

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Thu, 10 Oct 2019 08:20:05 GMT
Server
nginx
ETag
"5d9ee9b5-4525"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17701
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_143671-207893-207888_rc.jpg
www.golem.de/1910/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1910/sp_143671-207893-207888_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0f693c6aba8aa75743c84aefc18cc8fff719b28c50fd686593e2c06217b4420b

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 07 Oct 2019 10:05:06 GMT
Server
nginx
ETag
"5d9b0dd2-672d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26413
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_143624-208141-208139_rc.jpg
www.golem.de/1910/
30 KB
30 KB
Image
General
Full URL
https://www.golem.de/1910/sp_143624-208141-208139_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1beda9e2557f02f0dd2b812762764d9b7fc124427b8b8f92c6875bdf871d4ddd

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Thu, 10 Oct 2019 07:20:05 GMT
Server
nginx
ETag
"5d9edba5-7710"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
30480
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144237-210698-210696_rc.jpg
www.golem.de/1910/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144237-210698-210696_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9533bb17f56605789c5d4a01426750357321fb56fbc1d5b8263fd90f6217146b

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Fri, 04 Oct 2019 10:00:05 GMT
Server
nginx
ETag
"5d971825-4f89"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20361
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144263-210743-210741_rc.jpg
www.golem.de/1910/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144263-210743-210741_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2d361c1b072a0ff1eba4486d40d9bfc665649de37a7485e2c767b2916ba675b3

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 07 Oct 2019 07:00:05 GMT
Server
nginx
ETag
"5d9ae275-4f2e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20270
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144231-210635-210633_rc.jpg
www.golem.de/1910/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144231-210635-210633_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
006059b5c505c27618f2f09ab7040a054519ba26f6ec7e39e51c0275d2bdfd84

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Fri, 04 Oct 2019 07:29:04 GMT
Server
nginx
ETag
"5d96f4c0-4f49"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20297
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144197-210474-210472_rc.jpg
www.golem.de/1910/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144197-210474-210472_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
695975901a1980477161a4b92f908103f189b1b0390d928e26c50fda8cfba773

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Thu, 03 Oct 2019 09:27:04 GMT
Server
nginx
ETag
"5d95bee8-5eba"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24250
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144199-210537-210535_rc.jpg
www.golem.de/1910/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144199-210537-210535_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5268a163a89a7260e9efb7aaebfbb7c94926b62e22412dbdceeea3e9cf2ccf9b

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Wed, 02 Oct 2019 10:15:05 GMT
Server
nginx
ETag
"5d9478a9-48a5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18597
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144153-210287-210285_rc.jpg
www.golem.de/1910/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144153-210287-210285_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
19064fdcfa37b3d51780fdc7a7a0c3a66c427dd76a2aef43182a3e7c2c38b256

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 01 Oct 2019 10:02:05 GMT
Server
nginx
ETag
"5d93241d-4873"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18547
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_143458-206815-206813_rc.jpg
www.golem.de/1909/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143458-206815-206813_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
426f68dcb24674bd1bd5858200354768ed820ec0e99007041b2b32818b74b6db

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 30 Sep 2019 10:00:05 GMT
Server
nginx
ETag
"5d91d225-446b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17515
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144156-210302-210299_rc.jpg
www.golem.de/1910/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1910/sp_144156-210302-210299_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b47d7147d4470207c9a5d4a057d56ccb94563071d3d5bf1efc28de34fe39c7d7

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 01 Oct 2019 07:07:05 GMT
Server
nginx
ETag
"5d92fb19-3f62"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16226
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_144145-210123-210121_rc.jpg
www.golem.de/1909/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144145-210123-210121_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f3b9cc67684236b231e61430102e96757ef832a320fd599c948c5972372ee5a8

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Sat, 28 Sep 2019 19:01:04 GMT
Server
nginx
ETag
"5d8fadf0-6881"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26753
Expires
Sun, 17 Nov 2019 05:39:13 GMT
sp_143447-209772-209770_rc.jpg
www.golem.de/1909/
28 KB
28 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143447-209772-209770_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5439e343132fb3f2fd716b43ca950684fb21d14a10c1c5e8c9c14cae41a1310a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Mon, 30 Sep 2019 07:00:04 GMT
Server
nginx
ETag
"5d91a7f4-6e6e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
28270
Expires
Sun, 17 Nov 2019 05:39:13 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1571290754&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.149 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Thu, 17 Oct 2019 05:39:13 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame D54C
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753466&bpp=7&bdt=450&fdt=92&idt=92&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&correlator=4674202752223&frm=20&pv=2&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3946&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=a!8&fsb=1&xpc=b6SUb5MIFk&p=https%3A//www.golem.de&dtd=103
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753466&bpp=7&bdt=450&fdt=92&idt=92&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&correlator=4674202752223&frm=20&pv=2&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3946&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=a!8&fsb=1&xpc=b6SUb5MIFk&p=https%3A//www.golem.de&dtd=103
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

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, 17 Oct 2019 05:39:13 GMT
server
cafe
content-length
20063
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 17-Oct-2019 05:54:13 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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, 17 Oct 2019 05:39:13 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
28 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/r20191015/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f425f66d90f1150499b36ab47b56fa6fb1a68136e4f42befca20a920ff85306b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29055
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
rmpslider-rl_131-min.js
www.golem.de/staticrl/scripts/radiant/
21 KB
9 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_131-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:27 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290753634
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=17&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=ee461804c.8c29f55c6_1571290753632&1571290753635
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=ee461804c.8c29f55c6_1571290753632&1571290753637
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:ee461804c.8c29f55c6_1571290753632,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290753640
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
sp_EME4-659016_rc.jpg
www.golem.de/6195/
68 B
463 B
Image
General
Full URL
https://www.golem.de/6195/sp_EME4-659016_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
ads
googleads.g.doubleclick.net/pagead/ Frame 5587
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753473&bpp=5&bdt=458&fdt=189&idt=189&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=56&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4627&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=a!9&fsb=1&xpc=sLHmEK6lDW&p=https%3A//www.golem.de&dtd=192
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753473&bpp=5&bdt=458&fdt=189&idt=189&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=56&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4627&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=a!9&fsb=1&xpc=sLHmEK6lDW&p=https%3A//www.golem.de&dtd=192
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

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, 17 Oct 2019 05:39:13 GMT
server
cafe
content-length
20360
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 17-Oct-2019 05:54:13 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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, 17 Oct 2019 05:39:13 GMT
cache-control
private
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=b302346b0322fd916af0223f63c2321d&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Db302346b0322fd916af0223f63c2321d%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b302346b0322fd916af0223f63c2321d&userId=adscale-user:3fa1459893034302b51d3bccf06c74de
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b302346b0322fd916af0223f63c2321d&userId=adscale-user:3fa1459893034302b51d3bccf06c74de
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=b302346b0322fd916af0223f63c2321d&userId=adscale-user:3fa1459893034302b51d3bccf06c74de
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Thu, 17 Oct 2019 05:39:13 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=b302346b0322fd916af0223f63c2321d
43 B
1006 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=b302346b0322fd916af0223f63c2321d
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:15 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.19:80
AN-X-Request-Uuid
703843fd-448b-43e9-8d68-259fa5098f44
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=b302346b0322fd916af0223f63c2321d
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
98
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=swI0awMi_ZFq8CI_Y8IyHQ&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

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

Request headers

Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Wed, 16 Oct 2019 05:39:13 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=b302346b0322fd916af0223f63c2321d
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
99
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cookie set frame
delivery.selfcampaign.com/tag/146005/ Frame 50EC
0
0
Document
General
Full URL
https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Host
delivery.selfcampaign.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
_auid=70ab88ed6feb870cd25576f74e32ae4b
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Type
text/html; charset=utf-8
Transfer-Encoding
chunked
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Content-Type-Options
nosniff
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Pragma
no-cache
Expires
Fri, 01 Jan 1990 00:00:00 GMT
Vary
Accept-Encoding
Content-Encoding
gzip
Set-Cookie
_session_id=7a5d1f6722a0333890701d800df075eb; path=/; HttpOnly
X-Request-Id
fdee6fce-039a-4447-929c-e666e80f61cf
X-Runtime
0.011545
adex.js
dmp.theadex.com/d/506/3014/s/
36 KB
13 KB
Script
General
Full URL
https://dmp.theadex.com/d/506/3014/s/adex.js
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.110 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
last-modified
Tue, 11 Jun 2019 18:16:03 GMT
server
nginx
etag
W/"5cffefe3-90b2"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 17 Oct 2019 05:44:13 GMT
/
track2.selfcampaign.com/tag/
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/tag/?request_id=168b7597-7785-46f1-a313-ef468108a42b&_auid=70ab88ed6feb870cd25576f74e32ae4b&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=70ab88ed6feb870cd25576f74e32ae4b
  • https://track.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
  • https://track2.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Location
https://track2.selfcampaign.com/map_td/?tdid=ed342c89-10f9-4d53-8d1d-32ab3fb50c95
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx/1.6.2
Connection
keep-alive
Content-Length
160
Content-Type
text/html
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=1173
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173
  • https://track2.selfcampaign.com/map_td/?tdid=1218937380103331980&source=adform
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=1218937380103331980&source=adform
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:13 GMT
server
nginx
status
302
location
https://track2.selfcampaign.com/map_td/?tdid=1218937380103331980&source=adform
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-length
0
expires
-1
mark
lib.selfcampaign.com/tag/146005/
0
0
Image
General
Full URL
https://lib.selfcampaign.com/tag/146005/mark?t=1571290753
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.240.6 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:15 GMT
Last-Modified
Thu, 17 Oct 2019 04:52:10 GMT
Server
AmazonS3
x-amz-request-id
25C5948E444F9643
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
+8T/+sg6sc7RXcMrZFRjkmGXC72cp1N5Ujq0kZ7d4eqFKVvQrdZA/jwHb+UXFunHWi9vxIX5CeM=
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=UA-518800-2
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
6303
date
Thu, 17 Oct 2019 03:54:10 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Thu, 17 Oct 2019 05:54:10 GMT
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.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
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.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
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
796
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.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
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
795
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.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
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
794
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
ads
googleads.g.doubleclick.net/pagead/ Frame 6A1F
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753478&bpp=4&bdt=462&fdt=241&idt=241&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5336&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a!a&fsb=1&xpc=YouWYOCnvU&p=https%3A//www.golem.de&dtd=244
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1571290753&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1571290753478&bpp=4&bdt=462&fdt=241&idt=241&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5336&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a!a&fsb=1&xpc=YouWYOCnvU&p=https%3A//www.golem.de&dtd=244
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

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, 17 Oct 2019 05:39:13 GMT
server
cafe
content-length
20618
x-xss-protection
0
set-cookie
IDE=AHWqTUmqEFSkCWGa5ZesuNkQAwWX1sqVnzkBk1U2fPNPgszF8Wgyh4Paej52B65O; expires=Tue, 10-Nov-2020 05:39:13 GMT; path=/; domain=.doubleclick.net; HttpOnly test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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, 17 Oct 2019 05:39:13 GMT
cache-control
private
Cookie set /
d.agkn.com/iframe/8613/ Frame DAFB
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=252205592&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.187.173 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-185-187-173.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Thu, 17 Oct 2019 05:39:13 GMT
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma
no-cache
Server
Apache-Coyote/1.1
Set-Cookie
ab=0001%3Aie69XW%2BCgVSoUb1kXwDRs36sw7nUT%2FkJ;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlOrsBJTq7AQAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
sp_EME4-915232_rc.jpg
www.golem.de/8599/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/8599/ad-time/sp_EME4-915232_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
sp_EME4-273836_rc.jpg
www.golem.de/7515/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/7515/ad-time/sp_EME4-273836_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:13 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
999 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:15 GMT
Via
1.1 24c299c0a6423c6f96984a85fb014109.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C1
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
Ykn7vgDU638UbnxkLGO307cU955Hbjc715Sii7zqMbFdp-kMlby1wA==
Expires
0
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=553138793&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c00::9a Brussels, Belgium, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.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

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
date
Thu, 17 Oct 2019 05:39:13 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-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

Redirect headers

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:13 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=2062521108.1571290753&jid=733688719&_gid=1182937729.1571290754&gjid=320221929&_v=j79&z=884029694
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
415
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
122 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=553138793&t=timing&_s=2&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&utc=JS%20Dependencies&utv=load&utt=1059&_u=IAhAAUAB~&jid=&gjid=&cid=2062521108.1571290753&tid=UA-518800-2&_gid=1182937729.1571290754&gtm=2ouaa0&z=1132604976
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Fri, 11 Oct 2019 11:06:12 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
498781
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 9C0F
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1571290753&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1571290753539&bpp=4&bdt=523&fdt=228&idt=228&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&nras=1&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&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=11&uci=a!b&fsb=1&dtd=234
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1571290753&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1571290753539&bpp=4&bdt=523&fdt=228&idt=228&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&nras=1&correlator=4674202752223&frm=20&pv=1&ga_vid=2062521108.1571290753&ga_sid=1571290753&ga_hid=553138793&ga_fc=0&iag=0&icsg=47966899420928&dssz=58&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21063636%2C20040010&oid=3&pvsid=12599419205633&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=11&uci=a!b&fsb=1&dtd=234
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUnShiIJQCFvxwmccoGZen_u51leVHb1x9WE4msiKefgM86iXqLXGElO9I_3
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

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, 17 Oct 2019 05:39:13 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
5 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=436469
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:3cd , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
27ceddcc216bf0db3c81a60df6f48798f08d81b415c469d9545c1296fdee9fc9
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
1126
cf-ray
526fee4b9ff78ca4-VIE
status
200
last-modified
Thu, 10 Oct 2019 15:10:53 GMT
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/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=3600
timing-allow-origin
*
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Thu, 17 Oct 2019 06:39:13 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:13 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 1597
0
147 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstLMAldr1cwb4Mc_THmqyvbpJ0kugdk9OjQwMo_GrtWFwcQxNKNBWNQHULjkiVLu04EZpzhoBw4LU2fQDKKYBiJE7BYJwlL4xN1Pb-rK7jcD3KQxQahOnlUXZDL1QXgwm8BzOHJHJMIgIMZ7UT9GuQsuWLtFnOFz93SkgiIP9x43pGX6C5OQeHO3syHpfF8GHSVYmt-UUDzNgHYtAMBgBoZTTqDWPCis_t1j39dP_tdF-dPBYRrh9U3EU4f4DW1inJUboWplnfGT7X4fjJPwYs1OM5uoaSGcVwPjuv_a92vSOtUT9Rc&sai=AMfl-YT3zFQNo9hLev0-TmqdjZr-urPrgfWK7Zp2NMQPw_g1SlsAeOH62mRR0KnJzZ-EaRTWDmtXBmMDr5TgJtkiZCZwQ_EwhHM0j3cjMgpHRQ&sig=Cg0ArKJSzI3WGrGIgCeREAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
Cookie set adServer.bs
bs.serving-sys.com/BurstingPipe/ Frame 2967
0
0
Document
General
Full URL
https://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=rsb&c=28&pli=29025839&PluID=0&w=300&h=600&ord=1565171349&ifrm=2&ucm=true&ncu=$$https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjstxnwPmuiyRx9kX4kyZU_627s1AU9wcDNKnDhGGbL7Ll-Ak8hzk90cyBv97iQVCWznF1XwQloID7-Suu0OQ2L2VZPsgkpjUS0J7OCH9WJst1MVu064vT189XX3w0Y4D5P4KkkjBPVM0kN_yORowWQDZ1mybSepB9oZcv2BHDJfBdUm8jtDyZELDHvUrmbMoUoSTwzd_XFncatpYf9AiLeLNRdvuXqpNi8prFOmMwnTZ1AnJS5cUALXABXfquqHZN52co0k5-IFbH6UacYXIH-Dmqw%2526sai%253DAMfl-YRwED3uY9IPj2NdyR2V0ejGf0-aqSCkxmnhVj-R3-5w98v0uELxa6H3RPqL0UKKSB99zUAG_9UICiy4QiacSDfL0qIKw56T-3EAjk4GJA%2526sig%253DCg0ArKJSzCIE94r__iRcEAE%2526urlfix%253D1%2526adurl%253D$$
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
80.252.91.53 , Netherlands, ASN15830 (TELECITY-LON, GB),
Reverse DNS
Software
Microsoft-IIS/7.5 / ASP.NET ARR/2.5 ASP.NET
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, no-store
Pragma
no-cache
Content-Length
5094
Content-Type
text/html; charset=UTF-8
Content-Encoding
gzip
Expires
Sun, 05-Jun-2005 22:00:00 GMT
Server
Microsoft-IIS/7.5
P3P
CP="NOI DEVa OUR BUS UNI" CP="NOI DEVa OUR BUS UNI"
Set-Cookie
u2=47fd2f90-3b81-4288-9564-e0a978722d504sa080; expires=Wed, 15-Jan-2020 01:39:00 GMT; domain=.serving-sys.com; path=/; SameSite=None
Access-Control-Allow-Origin
*
X-Powered-By
ASP.NET ARR/2.5 ASP.NET
Date
Thu, 17 Oct 2019 05:39:13 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1597
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29551
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 9F47
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssdmlWJkaV6TgdeFWYxdHcSw-AhEAc4dCPQqdVbCMLJZk_f7RETuwe5vjbyuIG2n5hRr1jIzhbiee0k8F83EUwSqm2ass_LjbzOz9ynWPEp8Zs5W_41Ii756JtqgQC5zv10sP2Tkzo3PmFzebZ8EZ7oYPM45l99EgHwyD_Dxt9uQBZ0iGkSKXupfPQD4zrTcA-iTizfhwe57KU9A8pLd7F7ZGUKkZvRW0GAvF6J6UtH-e2dJHLaMwWUzAf9oPvyl7A_PgU-lTtyul4Tjc-mLzd0P77tg25KcoAkI4FzTlJAtPW4CXg&sai=AMfl-YQP4IX0svkybza3r6xW0IOOWGQFkfCaKR8ozyu2gC-gdmBGHojYuzRoWZtWyuF78xVWScNYHo-f_bTAiF7pAr2USYdNJ_a6-r_lBYBKfQ&sig=Cg0ArKJSzAK5ENQqOfj7EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
sDm_BB_Pos.js
cdn.stroeerdigitalmedia.de/Ads/script/ Frame 9F47
41 KB
8 KB
Script
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/script/sDm_BB_Pos.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
c534e1346983470faf83c909577623c7b2dd49d7029aa78785436be7f626eb2e

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
vary
Accept-Encoding
status
200
content-length
7630
last-modified
Wed, 09 Oct 2019 08:15:04 GMT
server
Apache
etag
"1839850986dd34799e8a1ab68effa485:1570608906"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
application/x-javascript
access-control-allow-origin
*
cache-control
max-age=95
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
expires
Thu, 17 Oct 2019 05:40:48 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 9F47
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29551
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 14EA
0
129 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstINl2qs7FDWnffJZxFPSSgqcPDjYJBW5d3-XrpOLmhdRoknBJJsBdfjWJlndpbJ0T0rRswXO7LMw0TlA118E1LM58C0CnuKpmQgbgOdWbY413luQnxyxvZtZME8WqHb9eYA61jgXXGGL_hLylgDr49SFOQJpcyDcJ1VFxUWBXZnjf9Em5WDwIhnxEbXbq1ls_UEsNld7XyHBPp-d5cN6MIIs2_8ZVwaQu7P97AFQXevDjQXlRmtbIiumjl7ikFyHotrA_jOrmdVmz7Oymad_6ArRM4rw&sai=AMfl-YSCLSIlsxsL8Zwie4Uix8Nt8QWJqiCyTfUp2Nk1Rqc0neEE8H1wO4ew68NH0U_Ew_aGXEGs3uxtqPhBTTr9Onk4CyklojtPQGE599_gOQ&sig=Cg0ArKJSzCMugSHor2xLEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

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

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29551
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
imgad
tpc.googlesyndication.com/pagead/ Frame 14EA
24 KB
25 KB
Image
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDnm4Oh2QEQARgBMgitfI9gey4F2g
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 11 Oct 2019 19:44:05 GMT
x-content-type-options
nosniff
server
cafe
age
467708
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/jpeg
status
200
cache-control
public, max-age=604800
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24989
x-xss-protection
0
expires
Fri, 18 Oct 2019 19:44:05 GMT
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
view
securepubads.g.doubleclick.net/pcs/ Frame FAB8
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstn9bwm7xD0dAKKvg7q-TcgJqL2Oltqq-ETRyfyTj6tzzW3j89hUNPuqbFKmqvVzTRdaVWTEGjBelMhL1E4oMDliGICTNt_w-1iaWyLt2vKezJ41ZySVj2s8t6sKwLn5vfMuQgxVk4Hi-0fMOz9hAGEDAOiS5RdT8f3LfAKNYkDrWqjVhDVw-p15nuoaeBN6rZF1UVlx7oXxiwPyk2Yd22kFyBQhh2XFaGRFNbqesuvuwfyPNUfTmfW76n54CeCvt3nkznXKwhJ0A8VV9JGAD_j5B1K&sai=AMfl-YQ3fw8DHZraHeJ4RbxvrICGw1eGtSQr-uXfsQZTLwgmviS9XSkykkzI2cPy95ySacE-LiZI0_CcJULzxPQuOBbXD1pBcEXFEuFXeKBdtQ&sig=Cg0ArKJSzGuxkTDowF8aEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame FAB8
45 KB
14 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
eed2b7b85bfd84ebdcda3f2d24b5b4566dc77d0340efb27b20e00a5b6085af2e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"309 / 974 of 1000 / last-modified: 1571261169"
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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14547
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame FAB8
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29551
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3651
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssYlKNWaDFlbL_557kKxe93FXc9jaL0d0d-lpyka3VXy7NeUkH9CF9szvzjGQRt5sd4NVDzDfBeyPNZfwrlNXFW2AM8nXcMVFDjx-UhYDuz3WG-3Z1U5plYaFcHJUCj0_o-yzZlyPvXqdlSxAfYijTH2k5LC_OJWLkH-WZxOkfTGshZ6tV6JX102Rmi8v3-yOKMSvVl_aOwjdltpC6N-wFQVe-0rapfvKS4b2YFNS7Y3wHAbm8bLyUHAASSbUtuErkbaHN7erpNtvEd8sWPIdsEsUYC&sai=AMfl-YRDCFABP845CfTr8aQftgmbY4eofuAdhZQ5oOOzuLK7IWy04sJNbstTSQx_IL3u2t4ylp1VP9zkgDJrkVVWmGKXWU85hzgJFkPu-eJzpg&sig=Cg0ArKJSzGhxWj7w2YpCEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:13 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 3651
45 KB
14 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
eed2b7b85bfd84ebdcda3f2d24b5b4566dc77d0340efb27b20e00a5b6085af2e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"309 / 702 of 1000 / last-modified: 1571261169"
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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14547
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3651
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1571051767941600"
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-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
29551
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
271 KB
92 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
874b56a76915540779f8844a67d2ec9586751d78055ae19da887b3eb8ecf67b5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:13 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
93961
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:13 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

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
/
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
/
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
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Sun, 17 Nov 2019 05:39:13 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 17 Oct 2019 05:39:13 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Sun, 17 Nov 2019 05:39:13 GMT
truncated
/ Frame 1597
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
49552d802b3864b11d61e249973ec605726c5fa898b83aa2d9d9a51b9e3a15cf

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
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=ee461804c.8c29f55c6_1571290753632&1571290754051
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
fw.adsafeprotected.com/rjss/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSitelist0... Frame 9F47
197 KB
67 KB
Script
General
Full URL
https://fw.adsafeprotected.com/rjss/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSitelist0108201931102019AdgapId01980018340071953001/?ftx=&fty=&ftadz=&ftscw=&ft_custom=&ftOBA=1&ft_agentEnv=0&ft_referrer=https%3A%2F%2Fwww.golem.de%2F&cachebuster=907575.2704937905
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.24 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.fw.adsafeprotected.com
Software
nginx /
Resource Hash
d5d23663e6acf63a8f87ae01969de4602e62c580d104df396ce906a4a591645d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Encoding
gzip
X-Server-Name
app39ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
fw.adsafeprotected.com
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Server
nginx
Expires
Wed, 31 Dec 1969 23:59:59 GMT
truncated
/ Frame 14EA
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
78189fefaefd7ca159c8a055d68b0af014751b34b951838f995cc00bb5eb52bc

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
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame FAB8
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
index.shtml
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
118 KB
24 KB
Document
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1df5b100172f9f38a2166f4c09d7ba338582ae38894df030b025e5e3e4cf54ae

Request headers

Host
www.golem.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
same-origin
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
golem_viewauto=desktop%3Agoogle_chrome_74; session_id=23e844b3-802f-4cf0-a869-374c0fd4b033; ioam2018=00131280b4dc4fce95da7fe81:1597556353510:1571290753510:.golem.de:2:golem:GHOME:noevent:1571290753510:p43fhv; __io_lv=1571290753631; __io=ee461804c.8c29f55c6_1571290753632; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __sc_uid_=70ab88ed6feb870cd25576f74e32ae4b; golem_us=b57d1a84; golem_uv=b57d1a84; golem_uz=b57d1a84; _ga=GA1.2.2062521108.1571290753; _gid=GA1.2.1182937729.1571290754; _gat_gtag_UA_518800_2=1; __gads=ID=927fd4c50ee77c67:T=1571290753:S=ALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
nginx
Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Type
text/html
Last-Modified
Wed, 22 May 2019 15:47:00 GMT
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Vary
Accept-Encoding
Content-Encoding
gzip
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.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
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
793
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRDiNAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A3xAy5Aw3A1yA01AzzA1zFxwExrFnuFkBF/k0FhEmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5BELlnFBUkzFnBPwDAAZAwSAcAAAAP0IAAAAAAABN4GAPBAAFAAN4GTYeNAPAAAhPAEQABYeNAZBAAOA55A55A85B55A58E55A55AFAy4Ax3AzBErYeNASksF8FjAAAAAAAAAAAAEAAAN4GAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4ExyA1BEMAxzA4yA5wA0xAz5Az4AGAkpFylFj0FAAAAJAx0A15A12A33A1BEKA1xA5zA5wA12A44AJAylFj0FhuFnsFlBFKA1xA5zA5wA12A44AKA1xA5zA5wA12A44A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAEQAsEA9BAFAAAYeNAAAAARA4tB1uFruFv3FutBzwAw4ExyA1BEAAAAAAAAAAAAAAAAQtjFCOhyUA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
pubads_impl_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 3651
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 03 Oct 2019 13:06:21 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58949
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:14 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 3651
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

timing-allow-origin
*
date
Thu, 17 Oct 2019 05:39:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
bridge3.342.1_de.html
imasdk.googleapis.com/js/core/ Frame B5C3
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.342.1_de.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:81b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.342.1_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
193123
date
Tue, 15 Oct 2019 04:14:57 GMT
expires
Wed, 14 Oct 2020 04:14:57 GMT
last-modified
Tue, 15 Oct 2019 04:10:05 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
177857
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
client.js
s0.2mdn.net/instream/video/
26 KB
11 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:81e::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10523
x-xss-protection
0
expires
Thu, 17 Oct 2019 05:39:14 GMT
skeleton.js
static.adsafeprotected.com/ Frame 9F47
Redirect Chain
  • https://fw.adsafeprotected.com/rfw/servedby.flashtalking.com/306581/37675975/imp/2/111066;3935697;201;js;BusinessAdvertising;VansDirectDisplayCPMRunofChannelBillboardBusinessAdBillboard800x250B2BSi...
  • https://static.adsafeprotected.com/skeleton.js
17 B
299 B
Script
General
Full URL
https://static.adsafeprotected.com/skeleton.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app15ami.ami.303net.pvt
ETag
"52b33699-11"
Content-Type
application/javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
17
Server
nginx

Redirect headers

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
X-Server-Name
app39ami.ami.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Location
https://static.adsafeprotected.com/skeleton.js
Cache-Control
no-cache
Connection
keep-alive
Content-Length
0
Server
nginx
sca.17.4.95.js
static.adsafeprotected.com/ Frame C4DD
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.95.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Encoding
gzip
Last-Modified
Tue, 19 Jun 2018 17:20:43 GMT
X-Server-Name
app15ami.ami.303net.pvt
ETag
"5b293b6b-4fda"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20442
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame FAB8
302 B
219 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2737931407413196&correlator=3982647042648050&output=ldjh&impl=fif&eid=21064578%2C21062415%2C21063204%2C21064521%2C21064580&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu=%2F53015287%2Fgolem.de_d_970x250_4_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32&scp=adslot%3Dbillboard2%26src%3Dsdg%26yieldlove_pid%3D18494%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522billboard2%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522f10x1%2522%255D%252C%2522as%2522%253A%255B%2522billboard2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522billboard2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b302346b0322fd916af0223f63c2321d%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n19-2%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-2%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-0%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n23-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-0%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252218494%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A18494.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D927fd4c50ee77c67%3AT%3D1571290753%3AS%3DALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg&cdm=www.golem.de&bc=31&abxe=1&lmt=1571290754&dt=1571290754289&dlt=1571290753886&idt=389&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=251&oid=3&adx=308&ady=1564&adk=2408324468&uci=mje1h89pyj45&ifi=1&ifk=3801567061&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&ga_vid=2062521108.1571290753&ga_sid=1571290754&ga_hid=1011560555&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
ba03830de11ce7061799f1aae4f67e05d7ca0e8012b0cb91075cde9c180aeee7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
130
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame FAB8
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js?21064578
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

ads
securepubads.g.doubleclick.net/gampad/ Frame 3651
306 B
212 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2337805765980549&correlator=4266859913123109&output=ldjh&impl=fif&eid=21064687&vrg=2019100301&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A536903688%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191017&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C301x250%7C300x126%7C34x32&scp=adslot%3Drectangle2%26src%3Dsdg%26yieldlove_pid%3D17300%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle2%2522%255D%252C%2522af%2522%253A%255B%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle2%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%2522b302346b0322fd916af0223f63c2321d%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-1%2522%252C%2522n19-2%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-1%2522%252C%2522n155-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-2%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-5%2522%252C%2522n137-0%2522%252C%2522n101-1%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-0%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-1%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-2%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-0%2522%252C%2522n105-0%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-0%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n23-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-0%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-1%2522%252C%2522n124-1%2522%252C%2522n75-1%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217300%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17300.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D927fd4c50ee77c67%3AT%3D1571290753%3AS%3DALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg&cdm=www.golem.de&bc=31&abxe=1&lmt=1571290754&dt=1571290754340&dlt=1571290753951&idt=382&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=2&adx=993&ady=4551&adk=4008869679&uci=46blrpot7irv&ifi=1&ifk=4200391111&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&ga_vid=2062521108.1571290753&ga_sid=1571290754&ga_hid=1752214803&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
1eb5b55f5d17d060da022e8abf0bfc5773266a253e28e871517b5be4aeabe550
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
134
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.golem.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_2019100301.js
securepubads.g.doubleclick.net/gpt/ Frame 3651
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019100301.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019100301.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=306581&asId=5ff2a8b9-e983-0400-e1af-e122889aea10&tv={c:rhspej,pingTime:-2,time:130,type:a,im:{sf:0,pom:1,prf:{beA:364,beZ:365,mfA:367,cmA:367,inA:368,inZ:371,prA:371,prZ:406,si:410,poA:411,poZ:417,cmZ:417,mfZ:417,loA:458,loZ:459,ltA:494,ltZ:494}},sca:{dfp:{df:0}},env:{gca:0},clog:[{piv:-1,vs:n,r:,w:0,h:0,t:45}],es:0,sc:1,ha:1,gm:0,slTimes:{i:0,o:0,n:130,pp:0,pm:0},slEvents:[{sl:n,t:45,wc:0.0.1600.1200,bkn:{piv:[126~1],as:[126~na.na]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rF8jSdz+1111|1112|12|1311|1312|1411|1412|15|161|17|18|19|1a11|1b*.306581-37675975|1c|1d|1e|1f|1g,idMap:1b*,rend:0,renddet:na,rmeas:0,slid:[google_ads_iframe_4444/disp_ctc_golem.de_sd/startseite_1,google_ads_iframe_4444/disp_ctc_golem.de_sd/startseite_1__container__,sdgAdServerContainer-banner,iqadtile3,screen,grandwrapper],sinceFw:83,readyFired:true}&br=u
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
X-Server-Name
dt04.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
truncated
/ Frame FAB8
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
de3fb8e3c109385df9ed9076bf06fc9ddf5ac16852977b86a2c5c8e09c058339

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
Enabler.js
s0.2mdn.net/ads/studio/ Frame 3999
123 KB
41 KB
Script
General
Full URL
https://s0.2mdn.net/ads/studio/Enabler.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/syseleven19/metakube/index.shtml
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
f544a9f1cb39a78a07147abdc5be387b21a75320d30cba0a580364d761aa772b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:29:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
595
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
41996
x-xss-protection
0
last-modified
Tue, 01 Oct 2019 16:55:46 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
access-control-allow-origin
*
cache-control
public, max-age=900
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 17 Oct 2019 05:44:19 GMT
truncated
/ Frame 3651
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
53dfbbb8ec2065add45f7b82400374dfb2848654e099106390221979e720639f

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
hd-main.js
hgc-cf-cache-1.svonm.com/
208 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=EexeYyCrJI
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4d8fc7a753e127f99aee9114fdea0a1a0d5ece41c355b641a468645fd582f9a0

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C1
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Wed, 16 Oct 2019 10:15:01 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 24c299c0a6423c6f96984a85fb014109.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
f6ruCcWQt4CVuuEikx7aaKb5vHWrC-0tkDwomR9nWHv5t8JKrjwvqw==
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRE0QAA/k0FwImvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wALlnFCUkzF2BP7AAAAAAAABRq1APBAAFAARq1Tl5/APAAAXUAKAABl5/AZAAAOA55A55A85B55A58E55A55AGAyxA53A5zArl5/APQCAhPAEQAHYeNAPAAAXUAKAAHl5/ASksFeFjAAAAAAAAAAAAEAAARq1AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAx2Aw4E2wAwBEMAxzA4yA44A30A04A4xAGAkpFylFj0FAAAAKA03Az5Ax3AzzA3xAKA1xA4yAz2A2wA2yADAzrF5BFKA1xA4yAz2A2wA2yAKA1xA4yAz2A2wA2yAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAl5/AAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFLAJlWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRF1QAA/k0FSNmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wALlnFDTkzFPPBBAAAAAAABtk6ASksFCFjAAAAAAAAAAAAEAAAtk6AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBQtjFSzt+YA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
truncated
/ Frame 9F47
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4b993b308a0663c8393c64d0098e6c69a2a50c3f034a693770419c5d543be6fe

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
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRG8QAAUkzFJBPBAAFAAtk6TbosAPAAA0EAcYABbosAZAAAOA55A55A85B55A58E55A55AGAyzA55Ax3ArbosARksF6d0EAcYAKPA7DAFAAAbosAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFlubQSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRH8QAA/k0FkRmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA43AywA41A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzAz0A13Ax5AxmAjpFk9BxzA4yA33Ax1Ay2AxyAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B1xAzzA01A3xA5xAmhEwkF91AxzAz0A13Ax5AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA44ATkzFARksFAQtjFJRZuZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRITRAALlnFEUkzFYBPHAAAAAAAAB9yjAPAAAFAA9yjTTfPAPAAAJGAMCABTfPAZBAAOA55A55A85B55A58E55A55AGAx0A22AyxArTfPASksFhFjAAAAAAAAAAAAEAAA9yjAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA33Ax1Ay2AxyAGAkpFylFj0FAAAAIAy4A3yAw4A11AKA1xAzzA01A3xA5xAGAihFuuFlyFKA1xAzzA01A3xA5xAKA1xAzzA01A3xA5xA0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFdJGAMCACMA6DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFH6AvSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRJTRAA/k0FMWmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA5zA5wA12A44AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA5zA5wA12A44AmhEwkF91Ax5Az5Aw1A24A4mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xAy5Aw3A10AxwA5mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F90A3zA5xA3zAz3AxmAjwFpkF9kElzFr0FvwFmhEwhF91Ax4AyzA22Aw2AymAjpFk9BxzA4yA44A30A04A4xAmzEp6Fl9Bx2Aw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF91Ax4AyzA22Aw2AymAhwFk9B1xA4yAz2A2wA2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0xA3wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA4wAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA43AywA41A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzAz0A13Ax5AxmAjpFk9BxzA4yA33Ax1Ay2AxyAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B1xAzzA01A3xA5xAmhEwkF91AxzAz0A13Ax5AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A0zA44AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AxyA5wA31A00AxxATkzFARksFAQtjF6xZGeA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:13 GMT
truncated
/
208 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d8fc7a753e127f99aee9114fdea0a1a0d5ece41c355b641a468645fd582f9a0

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
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=306581&asId=5ff2a8b9-e983-0400-e1af-e122889aea10&tv={c:rhspj7,pingTime:-10,time:428,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtMTIwfHxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNF81KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzQuMC4zNzI5LjE2OSBTYWZhcmkvNTM3LjM2fHwxfHwxfHxHb29nbGUgSW5jLnx8bg--,asp:1571290754644||6d572370d520955e6270e793b77cd361||675c74d5f114ba25a49fb0f4cb02f70f||5da6f724cb33ae1e61ae7049ae656782||2bf78edfc36a84429fd64dbb26bf4cfe||c462ecef40ce09d50a324072f030aeab||30cfa760bc2701b3be0c08a26f5879b0||2f3d9766291df43a3546a4be6b42fe3d||1529428597}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
X-Server-Name
dt04.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
F400FF69F00615E8
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Thu, 17 Oct 2019 05:39:14 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
6ehEDhidFRch1WjWKfk7Q9UhOngjuYSCKHfN7dSV2F1PUcUPCXhKqPkRDC7radjVyC47AiTPt1w=
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=44995993
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.110 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 17 Oct 2019 05:44:14 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:11:53 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Thu, 24 Oct 2019 01:31:57 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.51.174.200 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:14 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
Cookie set map
ih.adscale.de/ Frame 1FBE
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
ng=2#2578531849#26188179#0#d7~1&d10~5&d4~6&d11~0&d8~2&d9~2&d12~1&d1~1&d3~5; uu=3fa1459893034302b51d3bccf06c74de; tu=4#3775895480#48~b302346b0322fd916af0223f63c2321d~436469~0~0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Thu, 17 Oct 2019 05:39:14 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:14 GMT
Content-Length
663
Connection
keep-alive
Set-Cookie
tu=4#1061550443#48~b302346b0322fd916af0223f63c2321d~436469~0~0#101~~436469~436469~1#38~~436469~436469~1#72~~436469~436469~1#40~~436469~436469~1#42~~436469~436469~1#75~~436469~436469~1#60~~436469~436469~1#63~~436469~436469~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
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
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

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

Request headers

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

Response headers

date
Wed, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
1880104
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
eGOQ9FsXn1qOZYk0muzC3I_tTPteQ4XJiokdnCVqYUK8az0sgAgJtg==
via
1.1 1b73451818d2dd47a574604c0b84f692.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=b302346b0322fd916af0223f63c2321d&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=241221172442
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.51.174.200 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
dd8680fd5dae60786359a6b7cd623a54c0fd5b133211411ad83ef0342425cb61

Request headers

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

Response headers

date
Thu, 17 Oct 2019 05:39:14 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.35.6 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-35-6.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Wed, 16 Oct 2019 09:34:09 GMT
Content-Encoding
gzip
Last-Modified
Wed, 16 Oct 2019 09:15:54 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame DFBE
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBS7ZBiR0WiRZWSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4206909570601015878
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4206909570601015878
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.51.174.200 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.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

status
200
date
Thu, 17 Oct 2019 05:39:14 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:14 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4206909570601015878
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
launcher.js
sak.userreport.com/sdm/
60 KB
19 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/af00d4e8-1182-4a2a-bcd0-a15fa9be07ba/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.116 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-116.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
eedde56a328bd3001b95bcdf096f7c45b0332406236cb76f086243596625316b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

x-amz-version-id
BPjyltysu.TsEsx5JXrHlhNABJUB50TX
content-encoding
gzip
last-modified
Thu, 03 Oct 2019 09:05:39 GMT
server
AmazonS3
age
270
date
Thu, 17 Oct 2019 05:34:45 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=300
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
lgPGtfgduLXOBxahnz7-bARBUSVYkn5b1GGSrZe-jJF5U9qIqVcL1A==
via
1.1 ba5b5e2e7fd98c4a472633bc4c1d4480.cloudfront.net (CloudFront)
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=6277786461
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.240.6 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:15 GMT
Last-Modified
Thu, 17 Oct 2019 04:52:10 GMT
Server
AmazonS3
x-amz-request-id
1F0AE0B9E02F4E3E
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
qGVeNmbNKYXxMw6vXDQ79cACbNHUE4Nygdfgfl5fab6Ut3nECWPAMzdmfNwvEqyxxblywhW9g5c=
Expires
0
rmp-hcjson.php
video.golem.de/staticrl/scripts/radiant/
291 B
663 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php?cache=9458096450
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Transfer-Encoding
chunked
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
X-UPSTREAM
unix:/var/run/php-fpm.sock
Connection
keep-alive
Keep-Alive
timeout=3
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
992 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=2782838022
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:15 GMT
Via
1.1 24c299c0a6423c6f96984a85fb014109.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:56 GMT
Server
AmazonS3
ETag
"d6efb72fc51c297f7098e2b1c92794c5"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
kQWknH3W-zdpCew7zx3W5mZHpYUxkPJCVsCcTJxFFUR2_90dgf3j1A==
Expires
0
/
ssl.3.damoh.golem.de/9cb2d71f7f84b4ffdef77b1fb6fa294ecdc8d2e1/
311 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.golem.de/9cb2d71f7f84b4ffdef77b1fb6fa294ecdc8d2e1/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.91.175 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.175.91.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Connection
keep-alive
Content-Length
311
Last-Modified
Thu, 15 Aug 2019 08:26:57 GMT
Server
AmazonS3
Etag
"d6efb72fc51c297f7098e2b1c92794c5"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.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
de6-homad-1
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
activation
adstax-match.adrtx.net/ Frame 93AA
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
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Thu, 17 Oct 2019 05:39:15 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
hic_qos
ssl.1.damoh.golem.de/
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.2.60 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.60.2.251.148.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

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

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Last-Modified
Thu, 16 May 2019 12:48:04 GMT
Server
openresty/1.15.8.2
ETag
"5cdd5c04-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 3358
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
006a90d5787431e49366c26a452909a84625c23e9a393a315e9c90bd0fabca5c

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.3.damoh.golem.de/db67dad8109fb835786c8d8915d37cf25d55772d/
110 B
670 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/db67dad8109fb835786c8d8915d37cf25d55772d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.91.175 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.175.91.243.136.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 17 Oct 2019 05:39:14 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.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
110
activeview
pagead2.googlesyndication.com/pcs/ Frame 1597
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstRYzFEOenLtflP38Xa-hxdGXxnww16PS-WG-dXAb2iNMfml19P2oiCZ4zi_7bYRWyoVGqgBulybNL8JenZRgzcLYfnkJa3abOhGwOgKDk&sig=Cg0ArKJSzA8wtEtL7dz_EAE&adk=3761801772&tt=493&bs=1585%2C1185&mtos=0,1024,1024,1024,1024&tos=0,1024,0,0,0&p=10,1303,610,1603&mcvt=1024&rs=3&ht=0&tfs=492&tls=1516&mc=0.94&lte=0.94&bas=0&bac=0&met=no&avms=nio&niot_obs=163&niot_cbk=271&md=2&lm=2&rst=1571290753849&rpt=265&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-22-14-14-142-12-0-0-0&tvt=1509&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:15 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
activeview
pagead2.googlesyndication.com/pcs/ Frame 14EA
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsv-KoBz9y20K41dZq5P5nBeR7lDxSkewX0KNSg8uWJ3ioNtzqBeD3NhD7xbbeRwD4KTrPlisQ5kRQdCJ_nzWHDYB5isgupegX0hykUNX1M&sig=Cg0ArKJSzN5WgiikHGSDEAE&adk=2740773112&tt=493&bs=1585%2C1185&mtos=1024,1024,1024,1024,1024&tos=1024,0,0,0,0&p=1028,993,1153,1293&mcvt=1024&rs=3&ht=0&tfs=492&tls=1516&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=179&niot_cbk=271&md=2&lm=2&rst=1571290753866&rpt=246&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-22-14-14-142-12-0-0-0&tvt=1509&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:15 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-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
usersync
uss.xplosion.de/
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=b302346b0322fd916af0223f63c2321d
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.51.174.200 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

status
200
date
Thu, 17 Oct 2019 05:39:15 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
/
ssl.3.damoh.golem.de/b88991cba97dc53c990739b5dba0b4d0f631ad3f/
111 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/b88991cba97dc53c990739b5dba0b4d0f631ad3f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpUGlvYmFlWmV0ZWlTYWk9YWlQaW9iYWVaZXRlaVNhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS52cCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5PdihtKTthLk52KGwpO2EuQXYoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5Xdih7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXg9dGhpcy5hWzZdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuZ3k9dGhpcy5hWzNdO3RoaXMuY3g9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzZdO3RoaXMuWnc9dGhpcy5hWzhdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRnQ9dGhpcy5hWzddO3RoaXMuUGs9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19Yy5JbT1iO2IucHJvdG90eXBlPXskdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYXg6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOnRoaXMuZnkoYSl9LGZ5OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5neTp0aGlzLmJ4KGEpfSwKYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5ZdyhhKX0sWXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlp3OnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubzp0aGlzLkJrKGEpfSxCazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ2s6dGhpcy5FdChhKX0sRXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkZ0OnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSW18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLiR3KDQpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy52cD0hMTt0aGlzLkNiPSJzZXR1cCI7dGhpcy5PYz1bXTt0aGlzLm9lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVnUuYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLlNnPXt9O3RoaXMuZWY9ITF9Yy5naz1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm9iW2JdKyJfIik7cmV0dXJuIGF9LFpiOmZ1bmN0aW9uKCl7dGhpcy5lZnx8KHRoaXMuZWY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmVmfSxwYjpmdW5jdGlvbihhKXt0aGlzLm9iW2FdfHwodGhpcy5vYlthXT0wKTt0aGlzLm9iW2FdKz0xOzU8dGhpcy5vYlthXSYmIXRoaXMuU2dbYV0mJih0aGlzLlNnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMucXcoKSwhMCkpfSwKb2U6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFZ1OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlV1KGEuZGF0YSl9LFV1OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJgp0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGhlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHBnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmtoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxIZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sUG46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmhyKGEpKXJldHVybjsoYj10aGlzLnBnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0saHI6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTsKcmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxLczpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx5ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxvZjpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9CmEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxGZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7CnE9Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxHczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17V2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sZGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sY3M6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTmw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sWm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApSazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LHVtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sZXA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5XaSgpfHxhLmRqKCl8fGEuY3MoKXx8YS5ObCgpfHxhLlptKCl8fGEuUmsoKXx8YS51bSgpfX07cmV0dXJuIG51bGwhPWEuZXAoKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSwkYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGcjpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sY3E6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sZ3c6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQ2c6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmRpKGIpKyI6Iit0aGlzLmRpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxkaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZ2Y6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx6ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuZWUoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxDYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuemcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5DYyhCKX0sWHU6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5GcigpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LGh3OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5aYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWUoYSl9LGVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWUoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLktjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5LYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxMZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLktjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LE1lOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLkpwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1lKCl9LmJpbmQodGhpcyksNTAwKX0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxkZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuSGUoYSl8fHRoaXMuS3MoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5kZiYmd2luZG93LnNhbmRib3guZGZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy54ZyhhKSlyZXR1cm4gdGhpcy54ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5iYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucmQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUG4oZSxhKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGtoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxydDpmdW5jdGlvbihhLGIsZCl7dGhpcy5raChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5PYylmb3IodmFyIGMgaW4gdGhpcy5PYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk9jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxsaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMucnQoZi5yZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCld2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9jPWF9LGR5OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5iYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxmcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZ2t8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmZrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuR3U9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuTXQ9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHg9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5WcT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5WZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5aZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuR249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuVGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5xeD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHQ9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuV3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5sZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlRwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5YZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSW49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5XYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuYWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuY2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkhuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5raT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLk90PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudmY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5tZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuT3g9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXg9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLm54PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5seD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk50PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ma3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rbD10aGlzLmFbMV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5mdD10aGlzLmFbM107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbMV07dGhpcy5HbD10aGlzLmFbMl07dGhpcy50bz10aGlzLmFbMTBdO3RoaXMuanM9dGhpcy5hWzldO3RoaXMueWs9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNF19Yy5Ebz1iO2IucHJvdG90eXBlPXtqbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2w6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdDp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubG86dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sczp0aGlzLkZsKGEpfSxGbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR2w6dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnRvOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qczp0aGlzLnhrKGEpfSx4azpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkRvfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5qbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmhrPWI7Yi5wcm90b3R5cGU9e0FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LEFyOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7CmlmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubWQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5tZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQWUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm1kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSx6czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxaZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuQXIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksCmI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuaGt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMuYnA9dGhpcy5hWzVdO3RoaXMud3E9dGhpcy5hWzRdO3RoaXMuQ2o9dGhpcy5hWzddO3RoaXMuS289dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuQnE9YjtiLnByb3RvdHlwZT17VWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZpOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnA6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuQmooYSl9LApCajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ2o6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5CcXx8a2Esd2M9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuVWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oaCl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gaClmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLApiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm87dGhpcy5vPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5vPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5sOmZ1bmN0aW9uKCl7ZC5sLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2gucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1oO2guZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBofTtjLmtqPWJ9KShjKTt2YXIgTD1jLmtqfHxMO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLm9yPXRoaXMuYVs1XTt0aGlzLnNtPXRoaXMuYVs4XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLk1vPXRoaXMuYVsxXTt0aGlzLnNqPXRoaXMuYVs3XTt0aGlzLmp4PXRoaXMuYVs3XTsKdGhpcy5idD10aGlzLmFbMV07dGhpcy5Tdz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLkpsPWI7Yi5wcm90b3R5cGU9e21sOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ybShhKX0scm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNtOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qajp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuang6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMuUncoYSl9LFJ3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy5KbHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMubWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5ibT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5QdihiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKX0sSHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxjZjpmdW5jdGlvbigpe3RoaXMuSWI9CjB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxQdjpmdW5jdGlvbihiKXt0aGlzLkk9Yn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0ucHcoYil9LFd5OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxGczpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG56OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuYm18fHQ7KGZ1bmN0aW9uKGMpe2MuZG09TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz0KdGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxadjpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sWHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxTdjpmdW5jdGlvbihiKXt0aGlzLlBlPWJ9LFZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9CnRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQ2Q6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxwejpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5WcigpfHx0aGlzLktuKCk7dGhpcy5DZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LFl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEtuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFZyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTGg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSwKR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LCR5OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSxrejpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnk6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZG18fHA7KGZ1bmN0aW9uKGMpe2MuQWk9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy55bj0iMyI7dGhpcy5TYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdO3RoaXMucGM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuJGY9dGhpcy5naT0KITE7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5RdihhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHlzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5aYigpXT0xfSxDczpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnlzKCk7aWYoIXRoaXMuQ3MoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5oYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sJGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYKKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sWnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTWZ9LGpmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5OZn0sWHY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy55bn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlNjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sSHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlNjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFF2OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx5cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LHV0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Vdz10aGlzLmFbNF07dGhpcy5RbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5XeD10aGlzLmFbMTBdO3RoaXMuaG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzNdfWMuZXk9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlV3OnRoaXMuUGwoYSl9LFBsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbDp0aGlzLlZvKGEpfSxWbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuV286dGhpcy5WeChhKX0sVng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLld4OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5obzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG5hPWMuZXl8fG5hLHljPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlR3KDQpOyhmdW5jdGlvbihjKXtjLklqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBvYT1jLklqfHxvYTsoZnVuY3Rpb24oYyl7Yy5Kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuSXk7YT9hLnFhP2EucWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjsKYS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMudSgiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTsKdmFyIHBhPWMuSmp8fHBhOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLktqfHxxYTsobmV3IHFhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmw9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMudmk9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzJdOwp0aGlzLmJ3PXRoaXMuYVsxXTt0aGlzLlBtPXRoaXMuYVszXTt0aGlzLkZuPXRoaXMuYVs1XTt0aGlzLmVyPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMuJG09YjtiLnByb3RvdHlwZT17QWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuVHEoYSl9LFRxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VcTp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucWs6dGhpcy51aShhKX0sdWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZpOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kczp0aGlzLmF3KGEpfSxhdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnc6dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLmRyKGEpfSxkcjpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmVyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgcmE9Yy4kbXx8cmEsemM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuQWwoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt0aGlzLndnKCk7dGhpcy55ZygpO3RoaXMuU3A9ITF9LHdnOmZ1bmN0aW9uKCl7dGhpcy5jYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuY2M9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLmNjPSEwKTt0aGlzLlooYSl9fSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKSl9LE9lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkVkKGEpfS5iaW5kKHRoaXMpKX0sRWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMudmt8fHNhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LE06ZnVuY3Rpb24oKXt9LG9hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TYzt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuYmU9MTt0aGlzLlZjPVtdO3RoaXMudmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLmJlPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy52Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMudmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnZiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7CnRoaXMuVWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuVGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm9oJiYhdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnhhKCkmJih0aGlzLm9hKCksdGhpcy5nZXRQbGF5ZXIoKS5TcD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmKGEueGQoKSxhLnFlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm0oKSk6KHRoaXMudSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy51KCJhZGVycm9yIixiLmNvZGUpLHRoaXMuVmMubGVuZ3RoPj10aGlzLmJlJiZ0aGlzLm0oKSl9LHV0OmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiP3RoaXMudGU/dGhpcy50ZSsrOnRoaXMudGU9MTp0aGlzLnNlP3RoaXMuc2UrKzp0aGlzLnNlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLm9mKGEudmlkZW9UYWcpP2EuY2M/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMudWt8fHRhOyhmdW5jdGlvbihjKXtjLndrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMudnIoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5GcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5nKCkpfX10aGlzLlQoKX19LFR5OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHZyOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy53a3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Uaj10aGlzLmFbNl07dGhpcy5kbj10aGlzLmFbN107dGhpcy5qcD10aGlzLmFbMl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy5Ldz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLlhrPWI7Yi5wcm90b3R5cGU9e1NqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Uajp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZG46dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpwOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLkp3KGEpfSxKdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3c6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlhrfHx3YSxBYz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuU2ooNCk7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcykpfSxLZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLlJtfHx4YTsoZnVuY3Rpb24oYyl7Yy5RbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRmM9dGhpcy5DYT10aGlzLlpjPSExO3RoaXMuQmg9ZS5IYigxMCk7dGhpcy5maT0hMDt0aGlzLnVjPXRoaXMuV2c9ITE7dGhpcy5LdChiLmdldFJhd1BsYXllcigpKXx8KHRoaXMucmgoKSx0aGlzLkZwKCksdGhpcy5yYigpKX0sS3Q6ZnVuY3Rpb24oYil7cmV0dXJuIGUuZmEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5ZLCI7Iix0eXBlb2YgYi5ZLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouSWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5JYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuSWE/Yi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5JYT90eXBlb2YgYi5pbWEuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouWmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouJGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouaWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5CaCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sWWI6ZnVuY3Rpb24oKXtpZighdGhpcy5xYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMucWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMucWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMucWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMucWF9LEpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRmMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LERzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQnMoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlZnPSEwKX1yZXR1cm4gdGhpcy5WZ30sQnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlpjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5aYz0hMCk7cmV0dXJuIHRoaXMuWmN9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ZYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy54digpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LHh2OmZ1bmN0aW9uKCl7dGhpcy51Yz0hMDt2YXIgYj10aGlzLkpnKCk7aWYoYnx8dGhpcy54YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5WYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2UuZmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMudmN8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmdhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpfS5iaW5kKHRoaXMpLDIwKX0sU3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLm9nJiZiLmFkcyYmKHRoaXMub2c9Yi5hZHMpO3JldHVybiB0aGlzLm9nfSwKRnA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5nYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxnZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5KZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpLDUwKSl9LHJoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkRzKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuWWIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuWWIoKSx0aGlzLnVjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJoKCl9LmJpbmQodGhpcyksNTApfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sR3A6ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcCgpfS5iaW5kKHRoaXMpLDEwKX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxnYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5nZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxOcDpmdW5jdGlvbigpe3RoaXMuYXp8fCgxMDx0aGlzLkJ4Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQngrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5FdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OcCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxFdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuQ3gpe3RoaXMuQ3g9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5RbXx8eWE7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUmgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLlJoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LFJoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5TbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdsPXRoaXMuYVs3XTt0aGlzLlBxPXRoaXMuYVs4XTt0aGlzLm1rPXRoaXMuYVs5XTt0aGlzLnJzPXRoaXMuYVs2XTt0aGlzLkVwPXRoaXMuYVs2XTt0aGlzLmV1PXRoaXMuYVsxXTt0aGlzLnFxPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVs1XTt0aGlzLm15PQp0aGlzLmFbOV07dGhpcy5SaT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs4XX1jLlhpPWI7Yi5wcm90b3R5cGU9e2ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nbDp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1rOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5yczp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5kdShhKX0sZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmV1OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcTp0aGlzLm1zKGEpfSxtczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5zOnRoaXMubHkoYSl9LGx5OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5teTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlJpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5YaXx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5XKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sTnU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sQWE6ZnVuY3Rpb24oKXt0aGlzLlZlKys7aWYoMTA8dGhpcy5WZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxLZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlgmJnRoaXMuWCgpfX0pfSkoYyk7CnZhciBDYT1jLlNsfHxDYTsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy4kcT8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLiRxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuTnUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuUmx8fERhOyhmdW5jdGlvbihjKXtjLlRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlRsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXk9dGhpcy5hWzFdO3RoaXMucG89dGhpcy5hWzFdO3RoaXMuTGk9dGhpcy5hWzldO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuQ289dGhpcy5hWzVdO3RoaXMuaHQ9dGhpcy5hWzFdO3RoaXMuWXM9dGhpcy5hWzNdO3RoaXMuUXQ9dGhpcy5hWzRdO3RoaXMucGw9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy53bz1iO2IucHJvdG90eXBlPXtoeTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLml5OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMucG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MaTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW86dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNvOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5odDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWXM6dGhpcy5QdChhKX0sUHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLndvfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KQ2MuaHkoNCk7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuR2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy5UdT1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVHUpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLAphKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpO3RoaXMua2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5rZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LE1wOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmtkKTtlLkZlKHRoaXMua2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuc2t8fEhhOyhmdW5jdGlvbihjKXtjLnJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy5ya3x8SWE7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy50a3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5ZeD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbN107dGhpcy5BcT10aGlzLmFbMl07dGhpcy5iaz10aGlzLmFbOF07dGhpcy56cD10aGlzLmFbMV07dGhpcy5veT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLkRuPWI7Yi5wcm90b3R5cGU9e1h4OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXg6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ2OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcTp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYms6dGhpcy55cChhKX0seXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpwOnRoaXMubnkoYSl9LG55OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5veTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuRG58fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsCk1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1EYy5YeCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaWs9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sUnY6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxMbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmlrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuJGE9YTt0aGlzLkJnPXRoaXMub2k9ITE7dGhpcy5zaD1kO3RoaXMuU2g9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuJGE9Cm5ldyB6KGEpKTt2YXIgYz10aGlzLmdiPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFofHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGgoYyk7aWYoZCYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWQoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZtJiZtLkllKHRoaXMuJGEudXJsKSYmbS5OZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuUnYoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5pYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJgo0IT1jLnJlYWR5U3RhdGUmJmYoYyl9LmJpbmQodGhpcyl9Yy5qaz1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5nYi51cmxDYWxsZWQ9dGhpcy4kYS51cmw7dHJ5e3RoaXMuU2g/dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCExKTp0aGlzLmdiLm9wZW4odGhpcy4kYS5tZXRob2QsdGhpcy4kYS51cmwsITApLHRoaXMub2l8fCh0aGlzLmdiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5nYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmCnRoaXMuZ2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMuZ2Iuc2VuZChhKX1jYXRjaChmKXttJiZtLkllKHRoaXMuJGEudXJsKT9tLk5kP20uaWEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uSWUodGhpcy4kYS51cmwpLHRoaXMuc2gmJnRoaXMuc2goKX1yZXR1cm4gdGhpcy5nYn19fSkoYyk7dmFyIE1hPWMuamt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5IYT10aGlzLldkPSExfWMubGo9YjtiLnByb3RvdHlwZT17VnY6ZnVuY3Rpb24oYSl7dGhpcy5XZD1hfSxVdjpmdW5jdGlvbihhKXt0aGlzLkhhPWF9LEN2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLApiLGEpfSl9dmFyIGI9e3J5OiJBZENsaWNrVGhydSIsdHk6IkFkRXJyb3IiLHV5OiJBZFN0b3BwZWQiLHh5OiJBZExpbmVhckNoYW5nZSIseXk6IkFkVGFnUGFyc2VkIixCeToiQWRWaWRlb0NvbXBsZXRlIixFeToiQWRMb2FkZWQiLEZ5OiJBZFNraXBwZWQiLEd5OiJBZFN0YXJ0ZWQiLHZ5OiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsd3k6IkFkSW1wcmVzc2lvbiIsc3k6IkFkQ3JlYXRpdmVWaWV3Iix6eToiQWRWaWRlb01pZHBvaW50IixBeToiQWRQYXVzZWQiLEN5OiJBZFZpZGVvU3RhcnQiLER5OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuV2QsYltkXSl9LEJ2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsCmIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsYixhKX0pfWlmKHRoaXMuSGEmJnRoaXMuSGEuVmQpZm9yKHZhciBiIGluIHRoaXMuSGEuVmQpdGhpcy5IYS5WZC5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLkhhLHRoaXMuSGEuVmRbYl0pO3RoaXMuSGEmJnRoaXMuSGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuSGEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZzpmdW5jdGlvbigpe3RoaXMuV2QmJnRoaXMuQ3YoKTt0aGlzLkhhJiZ0aGlzLkJ2KCl9fX0pKGMpO3ZhciBOYT1jLmxqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy54Yz0iIjt0aGlzLmplPXRoaXMud2M9dGhpcy53Yj1udWxsO3RoaXMuZXE9dGhpcy5KYj10aGlzLmpoPSExO3RoaXMuTGE9CiIiO3RoaXMuZWg9ITE7dGhpcy53YT10aGlzLnBkPSIiO3RoaXMuJGc9dGhpcy5WPXRoaXMuaXNFbmFibGVkPXRoaXMuYWY9ITE7dGhpcy5wYT1bXTt0aGlzLlBnPXRoaXMuZ2M9IiI7dGhpcy5yZT0hMTt0aGlzLnNmPTA7dGhpcy5IZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5RYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuSmQ9W107dGhpcy5oYz0iIjt0aGlzLnRmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuRWM9ITE7dGhpcy5PcD10aGlzLlBkPW51bGw7dGhpcy5OaD10aGlzLm1jPXRoaXMudGc9CnRoaXMud2Y9dGhpcy5OZD10aGlzLmxlPXRoaXMuVGM9ITE7dGhpcy5pYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xZD0wO3RoaXMuUmc9ITE7dGhpcy5RZz0xRTM7dGhpcy5hZD0hMTt0aGlzLlFhPTFFMzt0aGlzLlBmPSIifWMua2s9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuVWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy54YyxhZHRhZ21vZGlmaWVyOnRoaXMud2IsYWR0YWdtb2RpZmllckFkdjp0aGlzLndjLGFkdGFncmVnZXg6dGhpcy5qZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5qaCxzaWRlbG9hZHM6dGhpcy5KYixkaXNhYmxldGVzdHM6dGhpcy5lcSxob21hZEFsaWFzOnRoaXMuTGEsaXNJbml0aWFsaXplZDp0aGlzLmVoLGdsb2JhbENvbmZpZzp0aGlzLnBkLGNsaWVudENvbmZpZzp0aGlzLndhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuVixpc0Jsb2NrZWQ6dGhpcy4kZywKc2VydmVyOnRoaXMucGEsc3ZtQ29uZmlnOnRoaXMuZ2MsaG9tYWRBZHBhdGg6dGhpcy5QZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLnJlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLnNmLEhPTUFEX1ZFUklGSUVEOnRoaXMuSGYsSE9NQURfQkxPQ0tFRDp0aGlzLkZmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLlFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLm9jLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5HZix0ZXN0SGlkZTp0aGlzLmljLHRlc3RUYWdzOnRoaXMuamMsdGVzdFRhZ3NKUzp0aGlzLmtjLHRlc3RUYWdzWEhSOnRoaXMuSmQsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5FYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLk9wLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLApjb25maWdGYWlsdXJlczp0aGlzLmliLHNpdGVDb25maWc6dGhpcy5GYSxzZXJ2ZXJJZDp0aGlzLktoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5rYix2cGFpZDp0aGlzLm1jLHNraXBBbGxvd2VkOnRoaXMuTmgsdm1hcHM6dGhpcy5saSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuYWQsYWRGYWxsYmFja1VSTDp0aGlzLlBmfX0sVHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmKGE9ITApO3JldHVybiBhfSxmZjpmdW5jdGlvbihhKXt0aGlzLmliW2FdPSEwfSx3cjpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5pYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmliW2JdJiYxPT10aGlzLmliW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LElkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLApNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLmZwKGEpfSx5YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuSGUoYSk7Yz10aGlzLnphKGEpO2Y/KHRoaXMuR2MoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuS2MoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/CiI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMueGN8fHRoaXMud2J8fHRoaXMud2N8fHRoaXMuamUpJiYoZz10aGlzLkJ0KGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMueHIoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuR2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxHYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5wYSYmdGhpcy5wYS5sZW5ndGgmJjA8dGhpcy5wYS5sZW5ndGgmJihiPXRoaXMucGFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5IZShhKTtyZXR1cm4gYn0seHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkxhJiYwPHRoaXMuTGEubGVuZ3RoKXJldHVybiB0aGlzLkxhO2ZvcihkIGluIHRoaXMuTGEpaWYoYj10aGlzLkxhW2RdLApiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk55O3JldHVybiJub25lIn0scmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYVt0aGlzLktoXX0sS2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkKCksYj10aGlzLk1oKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHBoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEF0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS56YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLApmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnBoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5waChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEJ0OmZ1bmN0aW9uKGEpe3RoaXMueGMmJihhKz10aGlzLnhjKTtpZih0aGlzLndiKWZvcih2YXIgYiBpbiB0aGlzLndiKXRoaXMud2IuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMud2JbYl0pKTt0aGlzLndjJiYoYT10aGlzLkF0KGEsdGhpcy53YykpO3JldHVybiBhfSwKTHA6ZnVuY3Rpb24oKXt0aGlzLkZhJiZ0aGlzLkZhLmNsaWVudEFQSXMmJnRoaXMuSHAodGhpcy5GYS5jbGllbnRBUElzKX0sSHA6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9bmV3IE5hO2EucHVibGlzaGVyQVBJJiZiLlZ2KGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYi5VdihhLnBsYXllcik7Yi5nKCl9fSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXttPXRoaXM7dGhpcy5laD0hMDt0aGlzLnBkPWE7dGhpcy53YT1iO3RoaXMuYWY9ZDt0aGlzLlBkPWY7dGhpcy5CYz1jO3RoaXMuRmE9ZXx8e307dGhpcy5McCgpO3RoaXMucXQoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMud2EpdGhpcy5vdCgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iKCksdGhpcy55YygpfWNhdGNoKGcpe3RoaXMuaWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9Yix0aGlzLnljKCl9Y2F0Y2goayl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LApxYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scXQ6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMucGQrdGhpcy5nZSgiZ2xvYmFsIikpLHRoaXMuUHIuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy55YygpfS5iaW5kKHRoaXMpLCEwKX0sb3Q6ZnVuY3Rpb24oKXt0aGlzLkRhKG5ldyB6KHRoaXMud2ErdGhpcy5nZSgiY2xpZW50IiwtMSE9dGhpcy53YS5pbmRleE9mKCI/IikpKSx0aGlzLnljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjbGllbnQiKTt0aGlzLmlhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxnZTpmdW5jdGlvbihhLGIpe3ZhciBkO2Q9KGI/IiYiOgoiPyIpKygiY2FjaGU9Iit0aGlzLkhiKCkpO3RoaXMuRmEmJnRoaXMuRmEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0saWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGUpe3RoaXMubGU9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuQmM9ITEpO3RoaXMuQmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5CYz90aGlzLkJjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlY9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5GZikpOwp0aGlzLk5iKCk7ZS5DYyhrLkd1KTsoYj1lLiRiKHRoaXMucmQoKSkpfHwoYj1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxQcjpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLk1iKGIuZW5hYmxlZCk7dGhpcy5WPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMud2F8fHRoaXMuZ2N8fHRoaXMuTGF8fHRoaXMueWMoKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT0KSlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMud2F9ZWxzZSBhPXRoaXMud2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5wYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMucGEubGVuZ3RoO2IrKyl0aGlzLnBhW2JdPXRoaXMucGFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLmZhKCJ3ZWIuZGUiKXx8ZS5mYSgiZ214Lm5ldCIpfHxlLmZhKCJnbXguYXQiKXx8ZS5mYSgiZ214LmNoIil8fGUuZmEoIjF1bmQxLmRlIikpJiYhdGhpcy5HYygpKWZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZ2M9YS5jb25maWd8fCIiO3RoaXMuTGE9YS5hbGlhc3x8bnVsbDt0aGlzLlBnPWEuYWRwYXRofHwiIjt0aGlzLnJlPQphLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLktoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLnBhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZ2MmJnRoaXMuTGEmJnRoaXMucGEubGVuZ3RoP3RoaXMuSGMoITEpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMuTmIoKSl9LEhjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlYpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMuS2MoKSksZD10aGlzLnphKHRoaXMuZ2MpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5nYyt0aGlzLmdlKCJjdXN0b21lciIpKTsKdGhpcy5EYShiLHRoaXMuc3cuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZmYoImN1c3RvbWVyIik7YT90aGlzLnRtP3RoaXMuaWEoIm5vU1ZNQ29uZmlnIik6KHRoaXMudG09ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLkhjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxzdzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkVjPSEwO3RoaXMuSGMoITApO3JldHVybn19dGhpcy5OZD10aGlzLk1iKGIuc3RyaWN0KTt0aGlzLndmPXRoaXMuTWIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMudGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmtiPXRoaXMuTWIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD0KdGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuaWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5rYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLkpkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy54Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLndjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5qZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5qaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkpiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLm1jPWIudnBhaWR8fCExO3RoaXMuRmEudnBhaWQ9dGhpcy5tYzt0aGlzLk5oPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYmQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmxpPWIudm1hcHN8fCIiO3RoaXMuYWQ9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuUGY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuaGM9Yi50ZXN0M3JkcGFydHljb29raWUmJgpiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuRXIoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnJlJiYodGhpcy5oYz1udWxsKTt0aGlzLnRmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuRWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkVjPSEwLHRoaXMuSGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTncoKSYmKHRoaXMuaWN8fHRoaXMua2N8fHRoaXMuamN8fHRoaXMuaGN8fHRoaXMuSmQpP3RoaXMuYWY/KHRoaXMuVWE9dGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5uZSgpLHRoaXMuTmIoKSk6dGhpcy55dygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnp3KCkpfX0seXc6ZnVuY3Rpb24oKXt0aGlzLnh3KCk7dGhpcy5BdygpfSxBdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIisKYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2ErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5hYSgxMCksZz1lLmFhKDEwKSxDPWUuYWEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsCiIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2EoQykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UueGIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS5qZCgpOwppZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlZhKCkpe2lmKHRoaXMuRmEmJnRoaXMuRmEucGxheWVyJiZ0aGlzLkZhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApO3JldHVybn10aGlzLmlhKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSx6dzpmdW5jdGlvbigpe3RoaXMuVj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpO3RoaXMuTmIoKX0sUGM6ZnVuY3Rpb24oYSl7dGhpcy5UYz0hMDt0aGlzLlZ8fCh0aGlzLlY9dGhpcy5VYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIoYSkpLHRoaXMuTmIoKSx0aGlzLm5lKCkpfSx4dzpmdW5jdGlvbigpe2lmKHRoaXMuaWMpe3ZhciBhPWUuamQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmloKCkpdGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTsKZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5pYyk7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5XaCgpfX1lbHNlIHRoaXMuV2goKX0sVmg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5EdyhmLAowPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5QYyh0aGlzLm9jLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuamM9dGhpcy5KZCkmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGYoKX0sRHc6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuRGEobmV3IHooYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LFdoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuRXcoYywKMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5WaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5rYyYmdGhpcy5rYy5sZW5ndGgpe3ZhciBkPXRoaXMua2Muc2xpY2UoKSxjO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5WaCgpfSxFdzpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gYygpe2coKSYmYigpfWZ1bmN0aW9uIGUoKXtnKCkmJmQoKX1mdW5jdGlvbiBnKCl7cmV0dXJuIEM/KHdpbmRvdy5jbGVhclRpbWVvdXQoQyksITApOiExfXZhciBDPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGgpe2g9PWEmJmcoKSYmZSgpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspOwprLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9YztrLm9uZXJyb3I9ZTtrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKGwpe2MoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oYz8odGhpcy5zZisrLHRoaXMuRGEobmV3IHoodGhpcy5oYyksdGhpcy53dy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5xZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLlRoKCl9LHFmOmZ1bmN0aW9uKGEpe3RoaXMuUGModGhpcy5HZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHd3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnNmP3RoaXMucGYoKTp0aGlzLnFmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuVGgoKTp0aGlzLnFmKCJBQUEiKX0sVGg6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCk7dGhpcy5uZSgpfSxpaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE5iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLlZhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuVGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLmZhKCJ0LW9ubGluZS5kZSIpfHxlLmZhKCJnaWdhLmRlIil8fGUuZmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuaWgoKSwhMCk7CmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkhmKSk7dGhpcy5QZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlBkJiZ0aGlzLlBkKCl9LEtwOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5UcigpKXt2YXIgYT10aGlzLndyKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSwkaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LERhOmZ1bmN0aW9uKGEsYixkLGMscSxnKXt0aGlzLnFkfHwodGhpcy5xZD0wKTt0aGlzLnFkKys7dGhpcy5xZD50aGlzLlFnJiYhdGhpcy5SZyYmKHRoaXMuUmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLlFnLCEwKSk7YT1uZXcgTWEoYSwKYixkKTtjJiYoYS5vaT0hMCk7cSYmZS5HcygpJiYoYS5CZz0hMCk7ZyYmKGEuU2g9ITApO3JldHVybiBhLmxvYWQoKX0sSXA6ZnVuY3Rpb24oKXtlLlZhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGM9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Yz1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT8KYS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkdjKCl8fChhPXRoaXMuemEoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtnLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2cubmV0d29ya1N0YXRlPT1nLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmlhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7Zy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7Zy5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx2dzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09CnRoaXMubGl9LEpwOmZ1bmN0aW9uKCl7dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy55YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5EYShhLHRoaXMucHguYmluZCh0aGlzKSx0aGlzLm94LmJpbmQodGhpcykpfSxweDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7cmV0dXJufWR8fHRoaXMuWHEoKX0sb3g6ZnVuY3Rpb24oKXt9LApYcTpmdW5jdGlvbigpe2UuQ2Moay5XcSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sbmU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuSmJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmthKCldPXRoaXM7ZS5iYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxOdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnRmfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmEubGVuZ3RoKV19LEhiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx4YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxjLGUsZyxrLGwsbT0wO208YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KG0rKyksYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sTWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixkLGg7Zm9yKGQ9NzswPD1kO2QtLSloPWE+Pj40KmQmMTUsYys9aC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsZz1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWdbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKylnW2NdPWQoZ1tjLTNdXmdbYy04XV5nW2MtMTRdXmdbYy0xNl0sMSk7ZT1rO249bDtwPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfH5uJnUpK3YrZ1tjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZwfG4mdXxwJnUpK3YrZ1tjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecF51KSt2K2dbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHIpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLmtrfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3Y9dGhpcy5hWzZdO3RoaXMuJHI9dGhpcy5hWzJdO3RoaXMuRHQ9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzVdO3RoaXMuT289dGhpcy5hWzZdO3RoaXMuRXU9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5rdT1iO2IucHJvdG90eXBlPXtmdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Y6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRyOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5EdDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucm86dGhpcy5ScyhhKX0sUnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pbzp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkV1OnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Pajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFBhPWMua3V8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmZ2KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMuYj1hO2EuZi5QP3RoaXMuZWI9YS5mLlAoKTp0aGlzLmViPSIiO2EuZi5ZZyYmYS5mLllnKHtwYXVzZTp0aGlzLnhkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuSWguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5oeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmpiO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuV2I9dGhpcy4kYz0hMTsKdGhpcy5jcD0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkdkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLnNwPWUuYWEoMTApO3RoaXMubWY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuWWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuWWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuU249Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy50aD10aGlzLkZkPSExO3RoaXMubWg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmZlPSExO3RoaXMuY2k9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249CnRoaXMuYmM9ITE7dGhpcy5VcD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5RZD10aGlzLk9iPXRoaXMucGU9dGhpcy5mZD10aGlzLkhkPXRoaXMuc2I9dGhpcy5uYz10aGlzLnZoPXRoaXMubGQ9dGhpcy5Pdz10aGlzLnViPXRoaXMuRmI9ITE7dGhpcy5zYz1bXTt0aGlzLmRjPXt9O3RoaXMuQXU9MjAwO3RoaXMuRGY9dGhpcy5RYz10aGlzLmtlPXRoaXMuQ2Y9dGhpcy4kZT0hMTt0aGlzLndkPXt9fWMuZWs9YjtiLnByb3RvdHlwZT17TXY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gYn0sYWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLAohMCk7dGhpcy5rdygpO2UudihrLkluLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9Yzt2YXIgZz0hMTtmJiZmLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlYpdGhpcy5tZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuTC5LcCgpLGY9bS5nZXRDb25maWcoKSx0aGlzLkwuVWEmJnRoaXMuTC5pc0VuYWJsZWQ/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6YixiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubWMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5haSgpLApuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlJhKCk7ZWxzZXt2YXIgdGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGMuTGUoYSxiLGMpfSw1MCl9fSxXZTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuUWQ9dGhpcy5PYj10aGlzLmxkPSExO3RoaXMuYz1hO3RoaXMuJHYodGhpcy5jKTt0aGlzLndkPW5ldyBRYSh0aGlzLmMudHgsdGhpcy52aWRlbyx7fSk7dGhpcy5NZyhhKTt0aGlzLnNjPXRoaXMuRGcoYSk7dGhpcy5QcCgpfSxNZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5IcihhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuRGcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ycihhKSkpO3JldHVybiBjfSxycjpmdW5jdGlvbihhKXt2YXIgYj0iIixjPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sSHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0KIiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmxiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuYWImJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuaGQmJmEuaGQuZXJyb3ImJmEuaGQuZXJyb3IuY29kZSYmKGI9YS5oZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlJjLmNvZGU6Yj09Ry5YZC5jb2RlP2UudihrLlB4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk6KGUuTWUoKSxiPT1HLktmLmNvZGUmJmUudihrLkx0LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpO2UudihrLlZxLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5sdygpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS52KGsucXgsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrOwpjYXNlIHcuTGYuY29kZTplLnYoay5VeCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLlp4LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuVWQuY29kZTplLnYoay5NdCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5teCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuRWYuY29kZTplLnYoay5ueCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5YYihhKTt0aGlzLlJhKCl9LApYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLktlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSwkdjpmdW5jdGlvbihhKXt0aGlzLnBlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLiRlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXo9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTsKdGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5TbiYmdGhpcy5wbGF5ZXIudmUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnZlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5NbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuJGUmJmIubG9hZCgpO2lmKHRoaXMuWGgoYikpe3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUW4oYik7CmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy4kZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUXAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSwKdGhpcy5ZdigpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSxZdjpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnZhJiZlLlJuKHRoaXMuYy5vcmlnaW4udmEpO3RoaXMuUGgoInNldHVwIix0aGlzLlphKCkpO3ZhciBhPXRoaXMuYi5GO3RoaXMuYi5GPUUucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuRixhKTt0aGlzLmIud2goKTt0aGlzLmIua2YoKTtmb3IoYT10aGlzLmIuSzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLmtmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuaGkoInZwYWlkIik7aWYodGhpcy5zYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudWQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmCnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuS3IoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubWEodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmIXRoaXMuSGQmJnRoaXMuYi5mLkFhKCkmJmUudihrLnpjLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLmFjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5FeCgpLHRoaXMuYi5hYyghMCksIXRoaXMuT2IpKXt2YXIgYj0KMkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5hYyghMCksdGhpcy5JeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuTXgoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkt4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuTngoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuSngoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuVmIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsubGcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5MLmFkfHx0aGlzLlFjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwpiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5IeCgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5GeCgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuUWMmJih0aGlzLkRmPSExLHRoaXMuZmMoKSksdGhpcy5HeCgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudWQsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX19LmJpbmQodGhpcykpO2UuaGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5oZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5hZyhmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LEZ4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LEd4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm5jPSExfSxJeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLllmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LEV4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuUWgoKTsKZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5sZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuUWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTHg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sTng6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpO2UudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LApKeDpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLm9lKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxEeDpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxiLm1hdGNoKGMpKTt0aGlzLlhhKCJ2cGFpZGVycm9yIik7ZS52KGsuT3gsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLm1pKCEwKX0sTW46ZnVuY3Rpb24oYSwKYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy55eC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxRbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxCZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5qaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuemYuYmluZCh0aGlzKSl9LGlpOmZ1bmN0aW9uKGEpe3RoaXMuV2J8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5BZihhKX0uYmluZCh0aGlzKSwKdGhpcy5jcCkpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5CZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLHRoaXMuWmEoKSwhMCksdGhpcy5MLnRnfHx0aGlzLkwuaWEoInZpZGVvLW5vb3AiKSk7dGhpcy5SYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuWmEoKSwhMCl9dGhpcy52eCgpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5iLmtmKCk7dGhpcy51eCgpO3RoaXMuaGkoKTt0aGlzLmVnKCk7dGhpcy5iLndoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLm5mKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZmR8fAp0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZmR8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYy5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfS5iaW5kKHRoaXMpO3RoaXMueGUoKS5MaCh0aGlzKX0seWY6ZnVuY3Rpb24oKXt0aGlzLkwua2ImJiF0aGlzLkZiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLkduLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxKbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuaHcoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmdGhpcy5jLlJkJiZ0aGlzLkpuKHRoaXMuYy5SZCk7aWYoIXRoaXMucGUpaWYodGhpcy5wZT0hMCx0aGlzLlFkfHwoZS52KGsuT3QsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5xYyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5tZisrO3RoaXMuV2I9dGhpcy4kYz0hMTt0cnl7dGhpcy5CZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkZkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5IZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOnRoaXMucWUoKSl9ZWxzZSB0aGlzLnFlKCl9LHl4OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQmQodGhpcy52aWRlbyksdGhpcy56ZihhKSl9LHpmOmZ1bmN0aW9uKGEpe3RoaXMuV2I9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLklwKCk7CnRoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5Pdyl0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5IZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuVncoYSk7aWYoIXRoaXMuT2Ipe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5PYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuUWQ9ITA7ZS52KGsua2ksdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi1hLDA8Yz9jPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpOihjPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyksdGhpcy5GZHx8KHRoaXMuRmQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLmMudGI/KHRoaXMuV2I9dGhpcy4kYz0hMSx0aGlzLkJkKHRoaXMudmlkZW8pLHRoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKSwKdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkZkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5ZYy5yZXBsYWNlKCJbdGltZV0iLGUuQ2codGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5mZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sYmk6ZnVuY3Rpb24oKXt0aGlzLnZofHwodGhpcy52aD0hMCx0aGlzLmxkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sVnc6ZnVuY3Rpb24oYSl7ZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthPT10aGlzLmNpfHx0aGlzLkZifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkwua2ImJnRoaXMuWWEoInN0YXJ0IiksZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSxlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuWWEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmxkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuUWYsdGhpcy5jLkIsCnRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5rYiYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuWWEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlpmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLHRoaXMuY2k9YSl9LFBoOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxrdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9jYWxsOiIrCnRoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5MZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxsdzpmdW5jdGlvbigpe2UuTGQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxYYTpmdW5jdGlvbihhKXtlLkxkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkNmfHx0aGlzLkwua2IpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5aYSgpLCEwKX0sS2I6ZnVuY3Rpb24oYSxiKXt0aGlzLkwua2ImJmUudHJhY2soInN0YXRzX2hkXyIrYSxiLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5GYil7dGhpcy53ZCYmdGhpcy53ZC50cmFjayYmdGhpcy53ZC50cmFjayhhKTtpZigibXV0ZSI9PQphfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5rZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkdkLmltcHJlc3Npb25zJiZlLkVzKGcudXJsLHRoaXMuR2QuaW1wcmVzc2lvbnMpP3RoaXMuS2UoZy51cmwsZy50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UudihrLkhuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx7YWRJZDp0aGlzLkdkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkEoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5LZShnLnVybCxnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLlBhPQp0aGlzLmJxKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwueWEoYSksYyYmYi5MbihjKSxmfHwoZj10aGlzLnNnKSxlfHwoZT10aGlzLnNnKSx0aGlzLk5uKGEpLHRoaXMuTC5EYShiLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkZoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxObjpmdW5jdGlvbihhKXt0aGlzLmRjW2FdPSJvcGVuIn0sRmg6ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0iY2xvc2VkIn0sUHA6ZnVuY3Rpb24oKXt0aGlzLmRjPXt9fSxvdzpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLmRjKXRoaXMuZGMuaGFzT3duUHJvcGVydHkoYikmJgoib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxicTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx2eDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMud3guYmluZCh0aGlzKSl9LHd4OmZ1bmN0aW9uKCl7ZS5WYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk/dGhpcy5mYygpOnRoaXMuYy5WYiYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuTC5hZHx8dGhpcy5RYylhPSJfYmxhbmsiOwp0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sdXg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy56Yi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LHpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LERkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYmQpJiZ0aGlzLmNhcHRpb24mJgp0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLlVwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkRkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLApmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkdiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWmguYmluZCh0aGlzKSkpOihmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSkpOwpmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5EZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2cuaWQ9dGhpcy5FYjtnLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXcuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Qdy5iaW5kKHRoaXMpKTsKZy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5PaDtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PQoxKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5sZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRGQoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGMpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249CiJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMuQmE9dGhpcy50YS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7dGhpcy5CYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5tZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuUWUoKSk7dGhpcy5BYigpfX0sQWI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxmYzpmdW5jdGlvbigpe3RoaXMuQmEmJiJibG9jayI9PXRoaXMuQmEuc3R5bGUuZGlzcGxheXx8dGhpcy5EZnx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLldjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLm5jPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5uYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuQWIoKSx0aGlzLnpiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5uYz0hMCl9LHhkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLmFlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxJaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuV2MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSkpfSxQdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sUXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLnNiPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuc2I9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLnNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LFFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKSxlLnYoay51ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0saHg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJjb250ZW50IiksCmUudihrLnZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxlYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmVjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5lYyk7dGhpcy5mZHx8dGhpcy5mZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmYoKSl9LHFlOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTt2YXIgYz1lLmpkKCk7IXRoaXMuTC5tY3x8ZS5WYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8CiEoYXx8IXRoaXMua2UmJmIuYWRGYWxsYmFja1VSTCl8fHRoaXMudGh8fCF0aGlzLkwuVGMmJiJzcGllZ2VsLmRlIiE9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8InByZXJvbGwiIT1lLkNiPyh0aGlzLmZkPSEwLHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMubmcoKSk6KHRoaXMudGg9dGhpcy5RYz10aGlzLkRmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLlphKCksITApLHRoaXMua2U9ITAsYT1lLmRnKGIuYWRGYWxsYmFja1VSTCx0aGlzLkwsITEse29ubHlVUkw6ITB9KSx0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSkpfSxuZzpmdW5jdGlvbihhKXt0aGlzLm93KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uZyghMCl9LmJpbmQodGhpcyksdGhpcy5BdSk6KHRoaXMuSGQ9ITAsdGhpcy5iLkJlKCksdGhpcy5iLkl2KCksdGhpcy5iYz0hMSwKZS52KGsuVHAsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnhlKCkuR2goKSl9LHhlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LGVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGUuRmUodGhpcy52aWRlbyxhKT90aGlzLkloKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLlZiLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnRiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuc2MmJjA8dGhpcy5zYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuc2MpKTt0aGlzLnZpZGVvJiYKdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEE6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLnNwKyItIit0aGlzLm1mO3RoaXMuYyYmdGhpcy5jLklnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5JZygpKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBSYT1jLmVrfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FaT10aGlzLmFbMTBdO3RoaXMuTW09dGhpcy5hWzhdO3RoaXMuTXU9dGhpcy5hWzddO3RoaXMudXc9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5GaT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWk6dGhpcy5MbShhKX0sTG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1tOgp0aGlzLkx1KGEpfSxMdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk11OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51dzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNhPWMuRml8fFNhLEZjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLkRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuR2E9bnVsbDt0aGlzLlk9W107dGhpcy5VPW51bGw7dGhpcy5yYz10aGlzLnRjPSExO3RoaXMudmE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2QmJmQuZW1wdHk/dGhpcy50dCgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKToKdGhpcy5sb2FkKCl9dmFyIGE9MCxoLGQ9W107Yy5ObT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5qZCgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLnlhKG0uSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5WYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5JZChhKSkrIiZ0eXBlPWpzIixiPW0ueWEobS5JZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bS55YShtLklkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfW0uRGEoYix0aGlzLnN0LmJpbmQodGhpcyksdGhpcy5wdC5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuR2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkNiKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkdhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuQ2J8fHRoaXMuSnMoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0udncoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sSnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxzdDpmdW5jdGlvbihhKXt0aGlzLm52KGEpO3RyeXt0aGlzLkdhPWEucmVzcG9uc2VYTUwsdGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPQp0aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5SYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LHR0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnNhKHRoaXMuU2Eody5ZZCkpfXRoaXMuWT10aGlzLkVnKCk7dGhpcy50Yz10aGlzLnJmKCk7dGhpcy5yYz10aGlzLlVoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLkpjKCk6dGhpcy5zYSh0aGlzLlNhKHcuUmMse2Vycm9yOnRoaXMuQmY/Ry5YZDpHLkpmfSkpfSxwdDpmdW5jdGlvbigpe3RoaXMuc2EodGhpcy5TYSh3LklmLHtkZXB0aDphfSkpfSxKYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlkuc2hpZnQoKTt0aGlzLkxzKCk/dGhpcy5GdygpPyhhKyssbmV3IGIodGhpcywKdGhpcy5OZygpLGgse0FkU3lzdGVtOnRoaXMucXIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5zYSh0aGlzLlNhKHcuTGYpKTooYT0wLHRoaXMua3goKSYmdGhpcy5XZSh0aGlzLlZwKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnRjPyh0aGlzLnRjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LlJlKCl9LHFoOmZ1bmN0aW9uKCl7dGhpcy5yYz8odGhpcy5yYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5KYygpKTp0aGlzLnBhcmVudC5xaCgpfSxreDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN3KCk/dGhpcy5CdygpPyEwOigtMSE9dGhpcy5EYygpP3RoaXMuc2EodGhpcy5TYSh3LlRkKSk6dGhpcy5zYSh0aGlzLlNhKHcuRWYpKSwhMSk6KHRoaXMuc2EodGhpcy5TYSh3LlJjLEcuS2YpKSwhMSl9LFdlOmZ1bmN0aW9uKGEpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLlJkfHwoYS5SZD1bXSk7YS5SZC5wdXNoKHRoaXMuVGcpOwphLlBhPWEuUGEuY29uY2F0KHRoaXMuTmUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy50YzthLnFjPWEucWM/YS5xYzp0aGlzLnJjO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5XZShhKX0sVnA6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGE7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuZHVyYXRpb249dGhpcy5EYygpO2EuTz10aGlzLktnKCk7YS5WYj10aGlzLnNyKCk7YS50eD1bXTthLm9yaWdpbj10aGlzO2EuQj10aGlzLnByKCk7YS5sZj10aGlzLkdyKGEuZHVyYXRpb24pO2EuYWI9YS5hYj9hLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0sc2E6ZnVuY3Rpb24oYil7dGhpcy52YXx8KHRoaXMudmE9IiIpO2IuYWI9Yi5hYj9iLmFiOi0xIT10aGlzLnZhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzsKdGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuVGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLnRyKCkpOmIuUGEuY29uY2F0KHRoaXMuQnIoKSkpO3RoaXMuWS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5YYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlhiJiZ0aGlzLnBhcmVudC5YYihiKSxhPTAsdGhpcy5KYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnNhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuc2EmJnRoaXMucGFyZW50LnNhKGIpLGE9MCl9LFhiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlhiKGEpfSx1ZzpmdW5jdGlvbihhLGIpe3RoaXMuc2EodGhpcy5TYShhLGIpKX0sU2E6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVWEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxGdzpmdW5jdGlvbigpe3JldHVybiBhPGh9LEN3OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5LZygpLmxlbmd0aH0sQnc6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5EYygpfSxyZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5yZigpJiYoYT0hMCk7cmV0dXJuIGF9LG52OmZ1bmN0aW9uKGEpe3RoaXMudmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy52YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnZhPSJVTktOT1dOIn10cnl7dGhpcy5CZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxMczpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTmcoKS5sZW5ndGh9LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLAoiVkFTVEFkVGFnVVJJIil9LHFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2UodGhpcy5VLCJBZFN5c3RlbSIpfSxOZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLmFoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5haChhLnBhcmVudE5vZGUpOgohMX0sQnI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sdHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk5lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LEtnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUWE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApPeTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSxwcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIiwKYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5vZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LEdyOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuZ3coZCxhKSwwPmImJgooYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sd2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx6ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMuTm18fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuSXU9CnRoaXMuYVs1XTt0aGlzLmdxPXRoaXMuYVs1XTt0aGlzLnJwPXRoaXMuYVs3XTt0aGlzLnNuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzJdfWMuUWs9YjtiLnByb3RvdHlwZT17U2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlRpOnRoaXMuSHUoYSl9LEh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JdTp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3E6dGhpcy5xcChhKX0scXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJwOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUWt8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLlNpKDQpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTz1bXTt0aGlzLlZiPSIiO3RoaXMuQj10aGlzLnFjPXRoaXMudGI9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5hbT1iO2IucHJvdG90eXBlPXtRcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx6cjpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uR2Epe3ZhciBhPXRoaXMub3JpZ2luLkdhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLnpyKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSwKYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sS3I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBUYT1jLmFtfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ibj10aGlzLmFbNl07dGhpcy5Tbz10aGlzLmFbNl07dGhpcy5nbT10aGlzLmFbNV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy5maj10aGlzLmFbMTBdO3RoaXMueHA9dGhpcy5hWzVdO3RoaXMucW49dGhpcy5hWzRdO3RoaXMuWHc9dGhpcy5hWzFdO3RoaXMuJG49dGhpcy5hWzFdO3RoaXMueHM9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMueHQ9YjtiLnByb3RvdHlwZT17YW46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJuOnRoaXMuUm8oYSl9LFJvOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuU286dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdtOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZqOnRoaXMud3AoYSl9LHdwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54cDp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucW46dGhpcy5XdyhhKX0sV3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh3OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kbjp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnh0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuYW4oNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sUmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sTGY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCk9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LFVkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApweTp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LHF5Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnd0PXRoaXMuYVsxMF07dGhpcy5scj10aGlzLmFbM107dGhpcy5tdj10aGlzLmFbNV07dGhpcy5waj10aGlzLmFbOV07dGhpcy5CcD10aGlzLmFbNl07dGhpcy53dT10aGlzLmFbNV07dGhpcy5yaT10aGlzLmFbOF07dGhpcy5Ndz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLll1PWI7Yi5wcm90b3R5cGU9e3Z0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy53dDp0aGlzLmtyKGEpfSxrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMub2ooYSl9LG9qOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy52dShhKX0sdnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnd1OnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5yaTp0aGlzLkx3KGEpfSwKTHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk13OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5ZdXx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5oZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkZqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ganx8VWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnQ9dGhpcy5hWzFdO3RoaXMuJG89dGhpcy5hWzRdO3RoaXMuWms9dGhpcy5hWzddO3RoaXMuYnY9dGhpcy5hWzFdO3RoaXMudGk9dGhpcy5hWzRdOwp0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQ2w9YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuWm8oYSl9LFpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbzp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ2OnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy50aTp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkNsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5ZdCg0KTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkhoPWE7dGhpcy52aWRlbz1iO3RoaXMuT2Q9W107dGhpcy5FaD1bXTt0aGlzLlNlPVtdO3RoaXMueHg9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLiRrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5pej17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Edi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy52di5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuT2QucHVzaCh7c3JjOmMsZnJhbWU6ZyxGdTplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KMDtiPHRoaXMuU2UubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TZVtiXTtjLnR5cGU9PT1hJiZjLkNwKHRoaXMudXIoYSkpfX0sdXI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7cno6ITAscXo6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7ZXo6InZpZGVvIix1ejoianNDdXN0b20iLHZ6OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsd3o6MSxQeTowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLApvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxKcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuT2QubGVuZ3RoO2IrKylpZih0aGlzLk9kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuT2RbYl0uRnU7cmV0dXJuIiJ9LER2OmZ1bmN0aW9uKGEsYil7dGhpcy5FaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5KcihiKSx2ZW5kb3I6Yn0pO3RoaXMuaXcoKX0sdnY6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLnh4Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxDcDpiLG96OiExfSl9LGl3OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Ic3x8KGEuaHooe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsCnRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5zeixjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSHM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuJGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJ4PXRoaXMuYVs2XTt0aGlzLkRxPXRoaXMuYVs4XTt0aGlzLmF5PXRoaXMuYVs5XTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLkhxPXRoaXMuYVsxXTt0aGlzLlhwPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMuTnE9YjtiLnByb3RvdHlwZT17UXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRHE6dGhpcy4keChhKX0sJHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF5OnRoaXMuV3IoYSl9LFdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuWHI6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhxOnRoaXMuV3AoYSl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5OcXx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuUXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLAp0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLm1yKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5ZcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0OgooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30scnc6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sCndoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LEl2OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZWQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmpiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFlyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxjcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj0KYi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrCiJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMucWp8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkp0PXRoaXMuYVs2XTt0aGlzLkZxPXRoaXMuYVs5XTt0aGlzLmZuPXRoaXMuYVs0XTt0aGlzLlVuPXRoaXMuYVsxMF07dGhpcy5ibD10aGlzLmFbNV07dGhpcy5ldj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVszXX1jLkNuPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSnQ6dGhpcy5FcShhKX0sRXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GcTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZuOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Vbjp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYmw6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5Dbnx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5DZChiKTt0aGlzLnFnKCl9LENkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxxZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5MbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuS2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuYXIoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmJjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTsKdGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5jZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5jZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVWYmJiF0aGlzLldmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApnZzpmdW5jdGlvbigpe2lmKHRoaXMuY2QoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLldmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVWY9Yi5NeX10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF5OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN6KCk6ITF9LERjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5EYygpOi0xfSxDcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxhcjpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksMTAwKX0sZGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5FZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkNyKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuS2x8fGRiOyhmdW5jdGlvbihjKXtjLk1sPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCklzOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmVtLnpuLnhuP3dpbmRvdy5PTy5lbS56bi54bi5LeShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JcygpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnllKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuTWx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuV249dGhpcy5hWzhdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMucW09dGhpcy5hWzNdO3RoaXMuSG89dGhpcy5hWzVdO3RoaXMuSXc9dGhpcy5hWzhdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5jdj1iO2IucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuV246dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk1xOnRoaXMucG0oYSl9LHBtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xbTp0aGlzLkdvKGEpfSxHbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhvOnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXc6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5wOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5jdnx8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLlZuKDQpOyhmdW5jdGlvbihjKXtjLmJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSx6aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuYmp8fGhiOyhmdW5jdGlvbihjKXtjLmFqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmhnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLmFqfHxpYjsoZnVuY3Rpb24oYyl7Yy5jaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5DZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5icnx8KHRoaXMuYnI9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkNoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5DaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLmNqfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbD10aGlzLmFbMTBdO3RoaXMuanU9dGhpcy5hWzddO3RoaXMudXA9dGhpcy5hWzldO3RoaXMuaXY9dGhpcy5hWzEwXTt0aGlzLk9zPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs1XTt0aGlzLm5uPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkd0PWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbDp0aGlzLml1KGEpfSxpdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuanU6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVwOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pdjp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLk9zOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LbTp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkd0fHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1OYy5obCg0KTsoZnVuY3Rpb24oYyl7Yy55bT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMueW18fFU7KGZ1bmN0aW9uKGMpe2MueG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5YYygiIyIrCmIsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlhjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVnQoYSl9LmJpbmQodGhpcykpO3guWGMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5YYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guU3IoKX0sVnQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5yYSgpOwpyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLnhtfHxWOyhmdW5jdGlvbihjKXtjLnptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnZkJiYoYj1lLmNxKGIsdGhpcy52ZCkpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnZkfHwodGhpcy52ZD1bXSksdGhpcy52ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sWGM6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sCkd3OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5IdigpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxTcjpmdW5jdGlvbigpe2lmKHRoaXMuSWMpZm9yKHZhciBiPTA7Yjx0aGlzLkljLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuSWNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0KMDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5HdyhiKX19KX0pKGMpO3ZhciBsYj1jLnptfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmpyPXRoaXMuYVs0XTt0aGlzLkVrPXRoaXMuYVs5XTt0aGlzLmRsPXRoaXMuYVs3XTt0aGlzLlhqPXRoaXMuYVs1XTt0aGlzLlRrPXRoaXMuYVs0XTt0aGlzLmN5PXRoaXMuYVs4XTt0aGlzLmpvPXRoaXMuYVszXTt0aGlzLlF1PXRoaXMuYVs3XTt0aGlzLnl1PXRoaXMuYVs3XTt0aGlzLnF1PXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzddfWMuS3E9YjtiLnByb3RvdHlwZT0Ke2lyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRWs6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Yajp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVGs6dGhpcy5ieShhKX0sYnk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jeTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlF1OnRoaXMueHUoYSl9LHh1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55dTp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgbWI9Yy5LcXx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuaXIoNCk7KGZ1bmN0aW9uKGMpe2MuWWk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSwKQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLllpfHxuYjsoZnVuY3Rpb24oYyl7Yy5aaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8CmEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgb2I9Yy5aaXx8b2I7KGZ1bmN0aW9uKGMpe2MuJGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KYlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy4kaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVsxMF07dGhpcy5DdT10aGlzLmFbMTBdO3RoaXMuaGo9dGhpcy5hWzVdOwp0aGlzLm50PXRoaXMuYVs1XTt0aGlzLnpqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMuUXE9YjtiLnByb3RvdHlwZT17QW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3U6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhqOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5udDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYj1jLlFxfHxyYixQYz1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9UGMuQW0oNCk7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlcoYik7dGhpcy5aKGEpO3RoaXMudXYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdXY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5wYXVzZSYmCnRoaXMuamEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEucmVzdW1lJiZ0aGlzLmphLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS5tdXRlJiZ0aGlzLmphLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEudW5tdXRlJiZ0aGlzLmphLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYil7dGhpcy5qYT1ifSwKUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMud2x8fHNiOyhmdW5jdGlvbihjKXtjLnZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5uaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5uaSYmKHRoaXMuRygpLHRoaXMubmk9ITAsdGhpcy5vYSgpKTthLkthKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnZsfHx0YjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsKXtpZihsLnBsYXllcil7dmFyIGI9bC5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGEpe2UudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLAoiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmcoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy54bHx8dWIsVz1uZXcgdWIocik7Vy5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzhdO3RoaXMuZGs9dGhpcy5hWzldO3RoaXMuQm49dGhpcy5hWzEwXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLkFvPXRoaXMuYVsxMF07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5Xcz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLmxsPWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5acDp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGs6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Cbjp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSms6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFvOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gbzp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB2Yj1jLmxsfHx2YixRYz1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5ZcCg0KTsoZnVuY3Rpb24oYyl7Yy5WbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5WbXx8d2I7KGZ1bmN0aW9uKGMpe2MuVW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkNhP3RoaXMuc3YodGhpcy5DYSk6KHRoaXMuQ2E9dGhpcy5ZYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkNhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuZmJbYV0mJjMwMyE9dGhpcy5mYlthXSYmNDAzIT10aGlzLmZiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5VbXx8eGI7KGZ1bmN0aW9uKGMpe2MuV209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB3YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLldtfHwKeWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVszXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLnBwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuSW89YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndqOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51ajp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5Jb3x8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMudmooNCk7KGZ1bmN0aW9uKGMpe2Mubm09CnAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5PdSgpfS5iaW5kKHRoaXMpLDUwMCl9LE91OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sbnc6ZnVuY3Rpb24oKXt0aGlzLlhlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTsKdmFyIEJiPWMubm18fEJiOyhmdW5jdGlvbihjKXtjLm1tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy56dD0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fAoodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMubGN8fHRoaXMubGMrKyx0aGlzLmxjPD10aGlzLnp0Pyh0aGlzLmxjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubncoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMubW18fENiOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsCnRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMub218fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51bD10aGlzLmFbM107dGhpcy5zcT10aGlzLmFbOV07dGhpcy53bT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLnhqPWI7Yi5wcm90b3R5cGU9e3RsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51bDp0aGlzLnJxKGEpfSxycTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3E6dGhpcy52bShhKX0sdm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgRmI9Yy54anx8RmIsU2M9bmV3IEZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLnRsKDQpOyhmdW5jdGlvbihjKXtjLmttPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMua218fEdiOyhmdW5jdGlvbihjKXtjLmptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkthKCksYT10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2EmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMuUnAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMubHQoKTp0aGlzLmpnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sUnA6ZnVuY3Rpb24oKXt0aGlzLlNmKCl8fHRoaXMubSghMCl9LGx0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZCgpOyFiLnFhJiZiLlkmJmIuSnkmJmIuTHkmJih0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZygpfS5iaW5kKHRoaXMpLDEwMCl9LG5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWgpZm9yKHZhciBiPWwucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkthKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLnVoPWJbY10pO3JldHVybiB0aGlzLnVofSxkejpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPwpiP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5qbXx8SGI7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgR2IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMubG18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuU3U9dGhpcy5hWzEwXTt0aGlzLk9yPXRoaXMuYVs1XTt0aGlzLnN4PXRoaXMuYVs4XTt0aGlzLnV1PXRoaXMuYVsxMF07dGhpcy52cz10aGlzLmFbNl07dGhpcy5Scj10aGlzLmFbMV07dGhpcy5ncz10aGlzLmFbN107dGhpcy5reT10aGlzLmFbOV07dGhpcy5Ncj10aGlzLmFbMTBdO3RoaXMuTms9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5UbT1iO2IucHJvdG90eXBlPXtSdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3U6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9yOnRoaXMucngoYSl9LHJ4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zeDp0aGlzLnR1KGEpfSx0dTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudXU6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Scjp0aGlzLmZzKGEpfSxmczpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmdzOnRoaXMuankoYSl9LGp5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3k6dGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1yOnRoaXMuTWsoYSl9LE1rOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Oazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVG18fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJ1KDQpOyhmdW5jdGlvbihjKXtjLlZrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtIJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGJ6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihIKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxBYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEthOmZ1bmN0aW9uKCl7dmFyIGI7SD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlllPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWWU9Yi5pZCk7SD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWWUmJmIhPXRoaXMuWWV8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5mYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLnUoImFkZXJyb3IiLGEuanopLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtIPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoSClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubmE/dGhpcy5jZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgSCxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VdD10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbN107dGhpcy5vdT10aGlzLmFbN107dGhpcy5zbD10aGlzLmFbNl07dGhpcy5ibz10aGlzLmFbNV07dGhpcy52bz10aGlzLmFbOF07dGhpcy5QaT10aGlzLmFbN107dGhpcy5scD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLnp1PWI7Yi5wcm90b3R5cGU9e1R0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdDp0aGlzLlRzKGEpfSxUczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXM6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vdTp0aGlzLnJsKGEpfSxybDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2w6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJvOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMudm86dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBpOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5scDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIE5iPWMuenV8fE5iLFVjPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVVjLlR0KDQpOyhmdW5jdGlvbihjKXtjLlpqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5XKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sCkx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxnejpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBPYj1jLlpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Zaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8KKHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIsYSksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTtiLk9uKCJmaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLk9uKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigidGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm9hKCl9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLllqfHxQYjsoZnVuY3Rpb24oYyl7Yy4kaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2J8fChiPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspOwppZihiJiZiLkdldEFsbFBsYXllcnMmJihiPWIuR2V0QWxsUGxheWVycygpKSYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBRYj1jLiRqfHxRYixSYj1uZXcgUWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQWs9dGhpcy5hWzhdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuSmk9dGhpcy5hWzEwXTt0aGlzLkt1PXRoaXMuYVs5XTt0aGlzLm5qPXRoaXMuYVsyXTt0aGlzLnVuPXRoaXMuYVsxMF07dGhpcy5Rcz10aGlzLmFbMV07dGhpcy5Zbj10aGlzLmFbM107dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5FbT1iO2IucHJvdG90eXBlPXt6azpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkFrOnRoaXMuUnEoYSl9LFJxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TcTp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSmk6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkt1OnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uajp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudW46dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlFzOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWW46dGhpcy5jbyhhKX0sY286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmVvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgU2I9Yy5FbXx8U2IsVmM9bmV3IFNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVZjLnprKDQpOyhmdW5jdGlvbihjKXtjLmtuPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlcoYSl9ZWxzZSB0aGlzLmNhKCl9LE1kOmZ1bmN0aW9uKGIpe3ZhciBhPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2E9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDp7fX0pOihhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGEuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZGF0YSkpO2EmJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGEpfSwKdHY6ZnVuY3Rpb24oKXt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXtpZihiLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlNkPSExfWNhdGNoKGEpe31pZigiYWRSZXF1ZXN0Ij09Yi5kZXRhaWwubmFtZSl0cnl7dGhpcy5TZHx8KHRoaXMuU2Q9ITAsdGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5NZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTWQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sCkFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgVGI9Yy5rbnx8VGI7KGZ1bmN0aW9uKGMpe2Muam49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYj13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2I/KGImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksYiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuVWIoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkRoLmJpbmQodGhpcyksMTApfSxVYjpmdW5jdGlvbihiKXt2YXIgYT17fTtiLmdldEVycm9yJiYoYi5nZXRFcnJvcigpLGE9Yi5nZXRFcnJvcigpKTthLmdldEVycm9yQ29kZT8oYS5nZXRFcnJvckNvZGUoKSx0aGlzLnUoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpLDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMubSgpKToodGhpcy51KCJub2ZyYW1ld29yayIpLHRoaXMubSgpKX0sT2Y6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYj0KMDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLkRoKCk7dGhpcy5PZigpO3RoaXMud3YoKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbihiKXt0aGlzLlViKGIpfSl9LG06ZnVuY3Rpb24oYil7dGhpcy5wdj90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYil7dGhpcy5wdj0hMDtpZihiJiZiLmRldGFpbClmb3IodmFyIGEgaW4gYi5kZXRhaWwpImFkVGFnVXJsIj09CmEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5qbnx8VWI7KGZ1bmN0aW9uKGMpe2MubG49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgVGIod2luZG93LkRMOF9HTE9CQUxTKTtiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi50digpLGI9bmV3IFViKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFZiPWMubG58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXE9dGhpcy5hWzEwXTt0aGlzLmV4PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNF07dGhpcy5EbT0KdGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNF19Yy5Baj1iO2IucHJvdG90eXBlPXt4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5keChhKX0sZHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmV4OnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lczp0aGlzLkNtKGEpfSxDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuQWp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLnhxKDQpOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKaWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5XKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSHQ9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LEx2OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IdH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5LZChiKX0uYmluZCh0aGlzKSl9LEtkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYKKHRoaXMueGg9ITAsdGhpcy5YJiZ0aGlzLlgoKSl9fSl9KShjKTt2YXIgTz1jLkdtfHxPOyhmdW5jdGlvbihjKXtjLkZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LENhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5YdigpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5TPWEsYi51KCJhZGVycm9yIixhKSk6Yi51KCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2EoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBQPWMuRm18fFA7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fAoodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuSG18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hdj10aGlzLmFbM107dGhpcy5vaz10aGlzLmFbOV07dGhpcy56bD10aGlzLmFbOF07dGhpcy5mdz10aGlzLmFbMV07dGhpcy5abD10aGlzLmFbN107dGhpcy5ocD10aGlzLmFbOF07dGhpcy5Waj10aGlzLmFbNV07CnRoaXMucHM9dGhpcy5hWzldO3RoaXMuTmk9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy5xbD1iO2IucHJvdG90eXBlPXtGdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR3Y6dGhpcy5uayhhKX0sbms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9rOnRoaXMueWwoYSl9LHlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56bDp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZnc6dGhpcy5ZbChhKX0sWWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpsOnRoaXMuZ3AoYSl9LGdwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ocDp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZqOnRoaXMub3MoYSl9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wczp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5xbHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuRnYoNCk7KGZ1bmN0aW9uKGMpe2MuR2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Ha3x8WjsoZnVuY3Rpb24oYyl7Yy5Gaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy5aYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Iaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkhrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3U9dGhpcy5hWzEwXTt0aGlzLnN1PXRoaXMuYVs4XTt0aGlzLkpxPXRoaXMuYVs5XTt0aGlzLmd4PXRoaXMuYVs3XTt0aGlzLlVvPXRoaXMuYVsyXTt0aGlzLlhsPXRoaXMuYVszXTt0aGlzLlN0PXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxMF07dGhpcy51cT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLkt2PWI7Yi5wcm90b3R5cGU9e2Z1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3U6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnN1OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnE6dGhpcy5meChhKX0sZng6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd4OnRoaXMuVG8oYSl9LFRvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVW86dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhsOnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5TdDp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3Q6dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgY2M9Yy5Ldnx8Y2MsWWM9bmV3IGNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuZnUoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGRjPWMuUWp8fGRjOyhmdW5jdGlvbihjKXtjLlBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmlnKCl9LGlnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZyghMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuUGp8fGVjOyhmdW5jdGlvbihjKXtjLlJqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBkYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5uYSl7dGhpcy5UKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUihiKTsobmV3IGVjKGIsdGhpcy5JKSkuZygpO3RoaXMuVCgpO3JldHVybn19dGhpcy5UKCl9fSl9KShjKTt2YXIgZmM9Yy5Sanx8ZmMsZ2M9bmV3IGZjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmF1PXRoaXMuYVs2XTt0aGlzLmN1PXRoaXMuYVs5XTt0aGlzLkNpPQp0aGlzLmFbM107dGhpcy5qPXRoaXMuYVsxXX1jLiRsPWI7Yi5wcm90b3R5cGU9eyR0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hdTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3U6dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy4kbHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuJHQoNCk7KGZ1bmN0aW9uKGMpe2MueGk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5XKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnhpfHxpYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLm1lKCk7dGhpcy5mZygpfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sc2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sRWE6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1lLmJpbmQodGhpcyksMTAwKX0sbWU6ZnVuY3Rpb24oKXtpZighdGhpcy54YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy53aXx8amM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxUYTpmdW5jdGlvbihiKXtiPW5ldyBpYyhiKTtiLm5hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGpjKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlRhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy55aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlltPXRoaXMuYVs5XTt0aGlzLmlxPXRoaXMuYVsyXTt0aGlzLnlvPXRoaXMuYVsyXTt0aGlzLklsPXRoaXMuYVszXTt0aGlzLmFxPXRoaXMuYVsyXTt0aGlzLkVsPXRoaXMuYVs4XTt0aGlzLm1xPXRoaXMuYVs5XTt0aGlzLkhqPXRoaXMuYVsxMF07dGhpcy53bj10aGlzLmFbMl07dGhpcy5vcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5pdD1iO2IucHJvdG90eXBlPXtYbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWW06dGhpcy5ocShhKX0saHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmlxOnRoaXMueG8oYSl9LAp4bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueW86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklsOnRoaXMuJHAoYSl9LCRwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1xOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLnZuKGEpfSx2bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud246dGhpcy5ucShhKX0sbnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm9xOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5pdHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPSRjLlhtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnlkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIE1iP251bGw6TWIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuY209YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5EcihhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9CiEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRHI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0scHc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMueWQubGVuZ3RoO2ErKyl0aGlzLnlkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWRbYV0uTGIpfX19KShjKTt2YXIgbmM9CmMuY218fG5jLE09bmV3IG5jO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZsPXRoaXMuYVs2XTt0aGlzLmt2PXRoaXMuYVsyXTt0aGlzLlR4PXRoaXMuYVs0XTt0aGlzLkF4PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuaHU9YjtiLnByb3RvdHlwZT17VWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZsOnRoaXMuanYoYSl9LGp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rdjp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy56eChhKX0seng6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5BeDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuaHV8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1hZC5VbCg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLmx4KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLk50KSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CkYud2lkdGg9MTtGLmhlaWdodD0xO0Yuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBiZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHJjPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBJPW5ldyBKLGw9ITE7SS5rYSgpO0kuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnpzKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWHQ9dGhpcy5hWzRdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuZHQ9dGhpcy5hWzNdO3RoaXMubXU9dGhpcy5hWzddO3RoaXMua3E9dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5Ncz1iO2IucHJvdG90eXBlPXtXdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHQ6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmltOnRoaXMuY3QoYSl9LGN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5kdDp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXU6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmtxOnRoaXMuYXMoYSl9LGFzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5iczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBjPQpjLk1zfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC5XdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnRkPTA7dGhpcy5lYj0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLkFoPSExO3RoaXMuWmU9W107ZS5wYigibmV3QWRkZWxpdmVyeSIpfWMuemk9YjtiLnByb3RvdHlwZT17VHY6ZnVuY3Rpb24oYSl7dGhpcy55aD1hfSxoZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE92OmZ1bmN0aW9uKGEpe3RoaXMubmI9YX0sTnY6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTsKdGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMuQXMoKSl0aGlzLm5iLmwodGhpcy5uYi5wZCx0aGlzLm5iLndhLHRoaXMubmIuYWYsZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcyksdGhpcy5uYi5CYyk7ZWxzZSBpZih0aGlzLlVyKCkpdGhpcy5KdihmdW5jdGlvbigpe3RoaXMuTmMoYSwKYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwucncoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7Uj1sPW5ldyBSYShsLHRoaXMubmIsZyk7bC5Ndih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMueXQoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5KZSYmKGM9dGhpcy5wbGF5ZXIuSmUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuTGUoYSxjLGYpOwp0aGlzLnBsYXllci5MaChsKX19LEFzOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudGQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy50ZC5nZXRUaW1lKCksdGhpcy50ZD1hLDNFNTxiPyEwOiExO3RoaXMudGQ9YTtyZXR1cm4hMX0sZHc6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS5nZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnZnKGEpKT90aGlzLk5jKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9LGN3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnloKXtlLmdmKCJwb3N0cm9sbCIpO2UucGIoInBvc3Ryb2xsIik7dGhpcy5UdighMCk7dmFyIGI9CnRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIucygpKSl9fSx2ZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0senY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5adih0aGlzLmN3LmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5hKCl9LEVkOmZ1bmN0aW9uKGEpe2UucGIoIm1pZHJvbGwiKTtlLmdmKCJtaWRyb2xsIik7aWYoIXRoaXMubmgpe3RoaXMubmg9ITA7dmFyIGI9dGhpcy5KYSgiYWRUYWciKTsKdGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnMoKSkpfX0seXY6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Tdih0aGlzLkVkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk9lKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLmR3KCk7dGhpcy5wbGF5ZXIuT2UmJnRoaXMueXYoKTt0aGlzLnp2KCl9LEF2OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuemQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmR5KGEsCmIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFVyOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LEp2OmZ1bmN0aW9uKGEpe3RoaXMuQWg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5XdS5iaW5kKHRoaXMpKX0sV3U6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuWmUucHVzaChhKTswPj10aGlzLkFkJiZ0aGlzLkFoKCl9LHl0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLlplLmxlbmd0aDtjKyspYj10aGlzLlplW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLnppfHxmYSxSPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maz10aGlzLmFbNV07dGhpcy5acT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsxMF19Yy5PbD1iO2IucHJvdG90eXBlPXtLazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGs6dGhpcy5ZcShhKX0sWXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgcWM9Yy5PbHx8cWMsZWQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZWQuS2soNCl9KS5jYWxsKGFpUGlvYmFlWmV0ZWlTYWksYWlQaW9iYWVaZXRlaVNhaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.91.175 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.175.91.243.136.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 17 Oct 2019 05:39:15 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://www.golem.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
111
activeview
pagead2.googlesyndication.com/pcs/ Frame 9F47
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvNulzrd6Gj4j01xExSbxFcNmHS1zbWft2yMCLO81bsqLPJJgV_E-NkWI6cwkUWdcB3eruf_UmscJmqGubRf0iWDnS6k_5PdA-z-koTZW8&sig=Cg0ArKJSzLCgpn150elCEAE&adk=2546325955&tt=809&bs=1585%2C1185&mtos=1039,1039,1039,1039,1039&tos=1039,0,0,0,0&p=140,393,390,1193&mcvt=1039&rs=3&ht=0&tfs=788&tls=1827&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=171&niot_cbk=270&md=2&lm=2&rst=1571290753858&rpt=532&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1603%2C12614&ss=1600%2C1200&pt=1025&bin=1&deb=1-2-9-32-17-14-169-15-0-0-0&tvt=1825&r=v&id=osdim&vs=4&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:15 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
60 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=ama_stats&wpc=ca-pub-2342548244565729&su=www.golem.de&pg_h=12614&pg_w=1603&c=7&aa_c=0&av_h=207.857&av_w=505.714&av_a=90442.857&s=10&all_s=10&b=6024.500&all_b=6024.500&d=0.115&all_d=0.115&ard=0.031&all_ard=0.031&dt=d
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:824::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

pragma
no-cache
date
Thu, 17 Oct 2019 05:39:15 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
copy_das_geht_weiss.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
3 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_das_geht_weiss.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d9e0f8d0b2e4b32750788003fb750dfa09231465ef6305d5a18c8627b7a6395c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:58 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_das_geht.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
3 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_das_geht.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d2788811244ca4e93a1c6517b8796fd78d15d0fa9370175d181489b25d4cf75

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:58 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_5_min.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
9 KB
3 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_5_min.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b958bd28ac8d63862f146f86abe2be25eb3aa8801e78cb7aa51758003f2df1b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:57 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_complete.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
3 KB
1 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_complete.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2a4d38e606b05e2abf8aef670cb70a280190229c4782c4b895ef9a955feffd6a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:58 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_loading.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
3 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_loading.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
97dbef439cfd9a53e0dc33705bc95c371345bdbcf5175ea229bc54bf72c8b804

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:59 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_6.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
488 B
850 B
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_6.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5b5eeb7503e92973f8ba8c0a8f1c04cad6465492c66bad02020305659960d47b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:02 GMT
Server
nginx
ETag
"5ce56ef6-1e8"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
488
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_5.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
669 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_5.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
629fcc746031933970c5cc0d795907f412297bc2233ae4b431f848361b6ef38e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:02 GMT
Server
nginx
ETag
"5ce56ef6-29d"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
669
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_4.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
670 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_4.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
697f15e272b5c4e845cbed04e84d11124faca445e25540a5e0d61f7d2f9858c4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:02 GMT
Server
nginx
ETag
"5ce56ef6-29e"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
670
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_3.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
672 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_3.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bbb4e2138e57d6be9503595e00f9c8c1dc0294e5639640bd64a1c6f840abb9b9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:01 GMT
Server
nginx
ETag
"5ce56ef5-2a0"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
672
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_2.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
616 B
978 B
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_2.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
52327f6f66b684ae19fa398b65040739be5355ae312d9775e8f6b09605a3ceb0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:01 GMT
Server
nginx
ETag
"5ce56ef5-268"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
616
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_1.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
535 B
897 B
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_1.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5ce12d4228d91c6d6e4fe41d4e9a4286dd3faca1353dcf29d4031b048b4fc9b0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:01 GMT
Server
nginx
ETag
"5ce56ef5-217"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
535
Expires
Sun, 17 Nov 2019 05:39:16 GMT
kacheln_0.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
503 B
865 B
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/kacheln_0.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
442682381d603ebae65b9cddb5709ea7e63d56ee806076474aede5e0ae07c9fa

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:00 GMT
Server
nginx
ETag
"5ce56ef4-1f7"
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
503
Expires
Sun, 17 Nov 2019 05:39:16 GMT
button.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
7 KB
3 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/button.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6045056627a05b73bab607110161e1c6a8b42dfada30ce4c432293fece312ecb

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:57 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
logo.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
5 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/logo.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
62e1670c3c2c673dfbbea2f6e457389ded2184c5fe3033ddc2d593855c1dd528

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:47:03 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_service.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
4 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_service.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2de6df83bb8ab8456a5c91374f01a64fb121198f6d52f8064170d4cd5b372d27

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:59 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
image_metakube.png
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/image_metakube.png
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5299440c9ac2eb433d53af334a8867c16450655d908736778bc537f9506c26d1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Last-Modified
Wed, 22 May 2019 15:47:00 GMT
Server
nginx
ETag
"5ce56ef4-4689"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18057
Expires
Sun, 17 Nov 2019 05:39:16 GMT
copy_metakube.svg
www.golem.de/microsite/syseleven19/metakube/ Frame 3999
4 KB
2 KB
Image
General
Full URL
https://www.golem.de/microsite/syseleven19/metakube/copy_metakube.svg
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
429a842a07070300d81a10a4fb83392008420d433b6c41a02457e4444d8b5e34

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.de/microsite/syseleven19/metakube/index.shtml
User-Agent
Mozilla/5.0 (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, 17 Oct 2019 05:39:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 22 May 2019 15:46:59 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sun, 17 Nov 2019 05:39:16 GMT
index.html
cdn.districtm.io/ids/ Frame 6A60
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.190.66 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

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

Response headers

status
200
date
Thu, 17 Oct 2019 05:39:17 GMT
content-type
text/html
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
cache-control
s-maxage=1209600, max-age=14400
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
526fee61ee9dd6fd-FRA
content-encoding
br
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame F719
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.130 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
icu=ChgIt6FYEAoYASABKAEwg_2f7QU4AUABSAEQg_2f7QUYAA..; uuid2=8030881189710540126; anj=dTM7k!M4.FE:2jUF']wIg2Hc%GbBz*!@wnfH8KW.eDVp+Z6$8*CyA*dUASFBE@eFmFp[l#Erk1`W:_F)Gm1CrUr3tXKU*kM%(2K:$doS]%6lOYfvep<
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Fri, 16 Oct 2020 05:39:17 GMT
Date
Thu, 17 Oct 2019 05:39:17 GMT
Connection
keep-alive
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 6CE7
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
KTPCACOOKIE=YES; KADUSERCOOKIE=A05B19C3-FAC3-4A39-A4DF-B7419AA1180C
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=34372
Expires
Thu, 17 Oct 2019 15:12:09 GMT
Date
Thu, 17 Oct 2019 05:39:17 GMT
Connection
keep-alive
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame 2BDD
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=ba546c5d-c4e9-0558-10dc-cd2e8b7b086d|1571290753
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept
set-cookie
i=ba546c5d-c4e9-0558-10dc-cd2e8b7b086d|1571290753; Version=1; Expires=Fri, 16-Oct-2020 05:39:17 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1571290757|mOgikimWiygu; Version=1; Expires=Fri, 01-Nov-2019 05:39:17 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Thu, 17 Oct 2019 05:39:17 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear
data
lb82.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb82.s400.meetrics.net/data?/BXZRKKOBALlnFFUkzFUCPXAAAAAAAABjWnAPAAAFAAjWnTCDTAPAAAhPAFHBBCDTAZAAAOA55A55A85B55A58E55A55AGAx2AxxA43ArCDTAPMDAJGAMCAHTfPAPAAAgMA6DAMTfPAPAAAhPAFHBICDTAPAAA0EAcYAIbosASksFFGjAAAAAAAAAAAAEAAAjWnAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPAFHBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFj4p9SA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.79 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h380.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:18 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 17-Oct-19 05:39:17 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1571290763643
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.golem.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

Pragma
no-cache
Date
Thu, 17 Oct 2019 05:39:23 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Verdicts & Comments Add Verdict or Comment

175 JavaScript Global Variables

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

object| onformdata object| onpointerrawupdate object| Golem object| _gcpx string| _rngnafc boolean| _rngnaf string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| de_meetrics number| google_srt boolean| google_measure_js_timing boolean| google_noFetch number| __google_ad_urls_id object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq function| $ function| jQuery object| iAbo function| golemAcceptCookies object| stroeerCore number| google_unique_id object| google_reactive_ads_global_state object| gaGlobal object| confiant object| adsbygoogle object| google_ad_modifications object| google_logging_queue 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 object| google_sv_map object| google_t12n_vars boolean| deliveringAds function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter boolean| subDomainCheckVar function| VPFWFdd object| skstm5daFlags string| skstm55aRnd object| skstmdb01tc string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag number| _m6rApiLoaded boolean| skstmb59sdl boolean| skstmb59sdln string| skstmdb01genat string| skstmdb01sthash boolean| skstmab1forceimp function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired function| Swiper object| __io boolean| skstm31dBody boolean| skstmcc0Detect object| skstm14cMobile object| skstmdb011 object| skstmdb01o1 object| skstmdb01o2 object| skstmdb01o3 object| skstmdb012 number| skstmdb01d3 object| skstmdb014 object| skstmdb015 boolean| skstm976ij object| google_tag_manager object| _m6rOnce number| _m6rContainerLoaded object| ScTag146005 object| ScTagAdditional146005 object| axd2 object| s object| _adexc object| rmp3pi function| SwfVideo object| exportz object| m function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb string| GoogleAnalyticsObject function| ga function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet string| _io_uniques_holing_params object| google_tag_data object| gaplugins object| gaData function| _h object| adex object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock boolean| disableMobilestopper number| BBWidth object| _google_rum_ns_ function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google object| closure_lm_587927 boolean| skstmf44Track object| closure_lm_53 object| aiPiobaeZeteiSai object| D function| videopkgInterface object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr string| apsrc object| audienceProjectLayer string| hic_qos object| google_image_requests

25 Cookies

Domain/Path Name / Value
.serving-sys.com/ Name: u2
Value: 47fd2f90-3b81-4288-9564-e0a978722d504sa08g
.serving-sys.com/ Name: eyeblaster
Value: RES=32
www.golem.de/ Name: __sc_uid_
Value: 70ab88ed6feb870cd25576f74e32ae4b
.agkn.com/ Name: ab
Value: 0001%3Aie69XW%2BCgVSoUb1kXwDRs6b1%2Fxh3aBWB4Loljjv9Sp02%2BWvZAX1xpw%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlOrsBJTq7AQAAAAAAAg1RAQCADVIBAIA
.selfcampaign.com/ Name: _autags
Value: T146005T
.golem.de/ Name: golem_uv
Value: b57d1a84
delivery.selfcampaign.com/ Name: _session_id
Value: 7a5d1f6722a0333890701d800df075eb
.doubleclick.net/ Name: DSID
Value: NO_DATA
.golem.de/ Name: _gat_gtag_UA_518800_2
Value: 1
.golem.de/ Name: __io
Value: ee461804c.8c29f55c6_1571290753632
.selfcampaign.com/ Name: _auid
Value: 70ab88ed6feb870cd25576f74e32ae4b
.golem.de/ Name: golem_uz
Value: b57d1a84
.golem.de/ Name: golem_us
Value: b57d1a84
.golem.de/ Name: __io_visit_43098
Value: 1
.golem.de/ Name: __gads
Value: ID=927fd4c50ee77c67:T=1571290753:S=ALNI_MaYfvPv2lJk348d94C9Imr1Yej2Gg
.golem.de/ Name: golem_viewauto
Value: desktop%3Agoogle_chrome_74
.golem.de/ Name: ioam2018
Value: 00131280b4dc4fce95da7fe81:1597556353510:1571290753510:.golem.de:2:golem:GHOME:noevent:1571290753510:p43fhv
www.golem.de/ Name: __io_lv
Value: 1571290753631
.golem.de/ Name: _gid
Value: GA1.2.1182937729.1571290754
.golem.de/ Name: _ga
Value: GA1.2.2062521108.1571290753
.golem.de/ Name: __io_unique_43098
Value: 17
.doubleclick.net/ Name: IDE
Value: AHWqTUmqEFSkCWGa5ZesuNkQAwWX1sqVnzkBk1U2fPNPgszF8Wgyh4Paej52B65O
www.golem.de/ Name: session_id
Value: 23e844b3-802f-4cf0-a869-374c0fd4b033
.golem.de/ Name: __io_uh
Value: 1

6 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1(Line 1)
Message:
No Cookie
console-api log URL: https://cdn.stroeerdigitalmedia.de/Ads/script/sDm_BB_Pos.js(Line 86)
Message:
BBDomain: www.golem.de
console-api log URL: https://s0.2mdn.net/ads/studio/Enabler.js(Line 150)
Message:
[ 0.000s] [studio.sdk]
console-api debug URL: https://static.adsafeprotected.com/sca.17.4.95.js(Line 32)
Message:
a: 0.0009765625ms
console-api log URL: https://s0.2mdn.net/ads/studio/Enabler.js(Line 150)
Message:
[ 1.009s] [studio.sdk] Using default ad parameters in test environment. Simulating local events.

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=15724800; includeSubDomains; preload

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.

acdn.adnxs.com
ad.yieldlab.net
ads.golem.de
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
api.theadex.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bs.serving-sys.com
c1.adform.net
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
cpx.golem.de
cpxl.golem.de
d.agkn.com
de-gmtdmp.mookie1.com
de.ioam.de
delivery.selfcampaign.com
dmp.theadex.com
dmx.districtm.io
dt.adsafeprotected.com
eu-u.openx.net
fw.adsafeprotected.com
golem.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb82.s400.meetrics.net
lib.selfcampaign.com
match.adsrvr.org
nugmw.userreport.com
orbidder.otto.de
pagead2.googlesyndication.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
sak.userreport.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
ssl.3.damoh.golem.de
static.adsafeprotected.com
stats.g.doubleclick.net
tpc.googlesyndication.com
track.selfcampaign.com
track2.selfcampaign.com
tracking.m6r.eu
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagmanager.com
www.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
104.109.82.87
104.16.190.66
104.244.36.20
108.128.71.27
116.202.11.240
13.224.196.116
13.224.196.120
13.225.78.17
136.243.12.39
136.243.33.79
136.243.91.175
148.251.131.173
148.251.2.60
148.251.69.233
151.101.113.194
172.217.16.162
172.217.21.194
18.185.187.173
185.33.223.209
185.64.189.112
188.40.118.169
199.166.0.24
199.166.0.32
2.16.122.151
2.18.232.130
2.18.233.180
2.18.233.67
2.18.234.21
2.18.234.72
2600:9000:20eb:ee00:15:efbc:e300:93a1
2600:9000:2156:4e00:12:6213:9cc0:93a1
2600:9000:2156:600:1c:8c89:a300:93a1
2600:9000:2156:b800:1f:a1b:34c0:93a1
2606:4700:20::681a:3cd
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:80b::200e
2a00:1450:4001:814::2008
2a00:1450:4001:816::2002
2a00:1450:4001:819::2002
2a00:1450:4001:81b::200a
2a00:1450:4001:81e::2001
2a00:1450:4001:81e::2006
2a00:1450:4001:824::2002
2a00:1450:400c:c00::9a
2a02:26f0:6c00:2bc::5f76
34.95.120.147
35.186.238.175
35.206.134.202
37.157.4.40
52.216.240.6
52.48.237.210
52.51.174.200
54.154.35.6
62.168.44.118
77.247.84.129
77.247.84.149
80.252.91.53
85.114.144.106
89.163.159.110
91.215.100.39
91.215.100.40
006059b5c505c27618f2f09ab7040a054519ba26f6ec7e39e51c0275d2bdfd84
006a90d5787431e49366c26a452909a84625c23e9a393a315e9c90bd0fabca5c
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04b305e567c7dd92c120d01f01efed4fdf3fd001084790a10d128adf5b39b152
0703192ee0216c94d21b7137a2fc4ff2087866ce61a5b38f07a6832144f81463
0b83c09854b3faab77b781ee6af48f40c63d67c4f6cb94cabdf7aae01708fe12
0f693c6aba8aa75743c84aefc18cc8fff719b28c50fd686593e2c06217b4420b
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10da54dd1f260713cd4238f6c9ea0d057d74424fb4ef30fd3334c4f3cbdad3be
1100871da6b19471ab46e147ae29a0559391d5469fa7777c4c91f3d50186d666
1154351398f442cae61c3f7a25a0816b6fbc252ce3d6cd93ef9e1a95531c977f
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc
1546b552377b93c37717ca60bc326dcce66ae9b423cb3e8b101b632451cb63d4
155ecec0a4fd0c4717e00ebea223b8f0db749cb4188da00184124778c334ae59
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
19064fdcfa37b3d51780fdc7a7a0c3a66c427dd76a2aef43182a3e7c2c38b256
199f635f74f535f28731dd7d665b9ea95a31f07e0453e3913d04c126e4f3a8e4
1a17f3d4340500d4af7ac53fafb237b77d6b5cb9257fd7e042cdddf638208fbc
1a58095266eb45b55188805f4507e88c0fa62d1fc111b67585e98a9f8b1c4e4e
1b958bd28ac8d63862f146f86abe2be25eb3aa8801e78cb7aa51758003f2df1b
1beda9e2557f02f0dd2b812762764d9b7fc124427b8b8f92c6875bdf871d4ddd
1df5b100172f9f38a2166f4c09d7ba338582ae38894df030b025e5e3e4cf54ae
1eb5b55f5d17d060da022e8abf0bfc5773266a253e28e871517b5be4aeabe550
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
21370ec310568c610e252ca1d5372b659efd87e28eb6fe953501d8bb37ac5f07
240cb0975add4519885f680e0cd751e67858dd02b3fbc36c48f30f25ce13edc3
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
2685d1e4e2343fcdf261a63df17cad548cd0452c75eca62b62a003a37abaf392
27ceddcc216bf0db3c81a60df6f48798f08d81b415c469d9545c1296fdee9fc9
2a4d38e606b05e2abf8aef670cb70a280190229c4782c4b895ef9a955feffd6a
2d361c1b072a0ff1eba4486d40d9bfc665649de37a7485e2c767b2916ba675b3
2de6df83bb8ab8456a5c91374f01a64fb121198f6d52f8064170d4cd5b372d27
32cd82ff718382b0b99fc856d2e208c3e8f28bcbea8eb0893a55a3831b5bb4f9
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
33e7cfb629c6fc28bec6f0039c2b843ac7d63cb54a883599ca33ce2384e251fa
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
353c659732155dd281ceb0c78f48b4f4335f20c0cf6c8b29a1b956823696c93b
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
426f68dcb24674bd1bd5858200354768ed820ec0e99007041b2b32818b74b6db
429a842a07070300d81a10a4fb83392008420d433b6c41a02457e4444d8b5e34
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
442682381d603ebae65b9cddb5709ea7e63d56ee806076474aede5e0ae07c9fa
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
49552d802b3864b11d61e249973ec605726c5fa898b83aa2d9d9a51b9e3a15cf
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4b993b308a0663c8393c64d0098e6c69a2a50c3f034a693770419c5d543be6fe
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4d8fc7a753e127f99aee9114fdea0a1a0d5ece41c355b641a468645fd582f9a0
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f607e9d4a5431d92e6ec18f98ee5504404534fa16eca7c0d80a9eb99fb2088a
4f62b577f2c8c16a3db499d50478c468dc84a8336f70c0602671d48c31f8a4aa
51f85281f32afbfbb77ddd51c2ce831c30479260b6ac45e53581d99a26e6bf2e
52327f6f66b684ae19fa398b65040739be5355ae312d9775e8f6b09605a3ceb0
5245051f3bf3eb34dda11c762c66f8730aeb7af0c5edb5939d2cd58a0ca6b835
5268a163a89a7260e9efb7aaebfbb7c94926b62e22412dbdceeea3e9cf2ccf9b
5299440c9ac2eb433d53af334a8867c16450655d908736778bc537f9506c26d1
53dfbbb8ec2065add45f7b82400374dfb2848654e099106390221979e720639f
5439e343132fb3f2fd716b43ca950684fb21d14a10c1c5e8c9c14cae41a1310a
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
550079eccef4f1087ec3d08253adffc27f37d7199a37b50456efab90dbeb72b2
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5b5eeb7503e92973f8ba8c0a8f1c04cad6465492c66bad02020305659960d47b
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ce12d4228d91c6d6e4fe41d4e9a4286dd3faca1353dcf29d4031b048b4fc9b0
6045056627a05b73bab607110161e1c6a8b42dfada30ce4c432293fece312ecb
629fcc746031933970c5cc0d795907f412297bc2233ae4b431f848361b6ef38e
62e1670c3c2c673dfbbea2f6e457389ded2184c5fe3033ddc2d593855c1dd528
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
695975901a1980477161a4b92f908103f189b1b0390d928e26c50fda8cfba773
697f15e272b5c4e845cbed04e84d11124faca445e25540a5e0d61f7d2f9858c4
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
767dea23d81a755d4ed641c33213274791f62289df03379e87acfc2667ab98dd
776ce395ae8b51da0c4260911b9f77f9c262f63f72bf7feb976033a5cd9428fa
78189fefaefd7ca159c8a055d68b0af014751b34b951838f995cc00bb5eb52bc
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
7c233780d8af4e9750d9c34694f3c1f2138a519d796a07778616edb176dd0933
81140620cdd8bea6d133e77c475b524d1e2558c0f185ee35cc151e1d653e05b3
814d8a0c1b15c12c98b8057d9c6dcaa36849084eff5002454d2465befd37e185
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
85fc83e2f6c3879999dfb9d0fb6134aa8ef31514e5d6b40fd4ec73c4ca92968e
874b56a76915540779f8844a67d2ec9586751d78055ae19da887b3eb8ecf67b5
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8a47575333ae39a4602b37cd9f5c1441781bad632beb4d53cc60bfd0d4d014f3
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc
8febd28d962604aa65b1ff06abc1d5fd75919d8e0db613e2a3357d429a152031
92d1994cace793adb74ca4a9e69eb746448b20aac8fd7124b03fb95694761187
9533bb17f56605789c5d4a01426750357321fb56fbc1d5b8263fd90f6217146b
96036061db82cbb085d2434ec1d09dac9987070bc69ac0722fc9b5f91d1b521b
97dbef439cfd9a53e0dc33705bc95c371345bdbcf5175ea229bc54bf72c8b804
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d2788811244ca4e93a1c6517b8796fd78d15d0fa9370175d181489b25d4cf75
9d58f4fa84c1cd57dd2c0125ab00b84e67e750cf7df09f6d1bd449027894add5
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9ea1703e650d183c65658dae4ad441f1a38d4060909766b10bea3a5977ab5157
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a349cbfc251b00bba5cd212aaa719f501d746ba47c068873d8ad0f5aaaa58cf9
ac06202496e2898299b18f6ef6b1ed44d07e7d60e9f59823c4377390c72de829
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b12b6d9365e6da88095ec8ae15ccb7d5c74590f7216bf99ef165aaa872240e61
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b29630448d7b1a86c9b8f753755e2a71ab64f267281af13ea63c027ef0c688bc
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b47d7147d4470207c9a5d4a057d56ccb94563071d3d5bf1efc28de34fe39c7d7
b4f80f496f00767f67a9cd2636a89969c670c1ba2cca9895a4ace8508b9f39f5
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b79fac74aafdb97b28a21685ad9d73f2b44d0301c0320446316f8a8bec3707c4
b9c5b99711415ae2d2a71942369d0fbcbfa834e364571e33453d05fba350b4be
ba03830de11ce7061799f1aae4f67e05d7ca0e8012b0cb91075cde9c180aeee7
bb1e75f1c4466db6b292509996b6a61ecd7ce1e82dcec81cdcac205a458b49df
bbb4e2138e57d6be9503595e00f9c8c1dc0294e5639640bd64a1c6f840abb9b9
bcbc1076c3a9bbc1c5d9ddecf15ae98100afec5266604d053e959ec6a345ae19
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05
c11697a9a07f45b6fa8cf484a57f6421cdd9a0cfc36380ff167ffba229baa811
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c534e1346983470faf83c909577623c7b2dd49d7029aa78785436be7f626eb2e
c6612fd7ee3032ba2bf75d467975737ce001a6d4b811e2bc796fd59edd95d1f3
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d044364d3994327174d8bc935b98c4baf5361060fead44cc6a27e14feaffd885
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d41913f07b517a14c9a356c9eb549f53ca0ef54bc6ee6cdecd4f029f646be36b
d4f303e0babff67a0349a523737b9246c64ab003bf0e3c3fa0dee61bf0213943
d5d23663e6acf63a8f87ae01969de4602e62c580d104df396ce906a4a591645d
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
d87e21f6043884b3c8c479531f55ec110fedaa9879ac139c2a72773b09998ed9
d98e77e558ef5c298f4c28cdd1604914a16a3fcc9249904ba70c57d989fb6aab
d9e0f8d0b2e4b32750788003fb750dfa09231465ef6305d5a18c8627b7a6395c
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dcb51642ff64569b990436c6b1eff0458a639569ff473d33524893163a4f1abf
dd8680fd5dae60786359a6b7cd623a54c0fd5b133211411ad83ef0342425cb61
de3fb8e3c109385df9ed9076bf06fc9ddf5ac16852977b86a2c5c8e09c058339
df11255dcd08e3c8b1365ad3c28377acb1ae7ae75a0148720688bdac56a1ed0d
df3a45bc8057dd992a9f90de32edc35e087fb94a0ff77cd095c6843a64335d81
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e40c0cd11a909101b6ab6831fa77a7546ec04e2e26589d8360469a05c46331d4
e4622cefb313ecfd3bbf5345548461f8b74b1c3c60303fa6d695172b5db5ac8e
e6432d889ce2c16ba3f0a8055e28e63d2b1c457a0664cd6030cdf9c02e21ac1d
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eb2d4c1eaafe682ff6812116e38b14e93c8e4e460a54d3d4c06427b06f3617c3
eb400996751157f4090045586d4c62b5b4eefa713b9633742e48f09421bc8cf1
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
eea98e96806aae56eab20d87b93d94856191cdf7656a9f37c983159604e3d142
eed2b7b85bfd84ebdcda3f2d24b5b4566dc77d0340efb27b20e00a5b6085af2e
eedde56a328bd3001b95bcdf096f7c45b0332406236cb76f086243596625316b
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f3b9cc67684236b231e61430102e96757ef832a320fd599c948c5972372ee5a8
f425f66d90f1150499b36ab47b56fa6fb1a68136e4f42befca20a920ff85306b
f486fb868d59a8ad6c09b3e94d2dec83dfa05534102d821dbc5a62b2c11990c8
f544a9f1cb39a78a07147abdc5be387b21a75320d30cba0a580364d761aa772b
f6be470af0f571c15a41117fa40ce97339adce5d11844b6643af2c6985ea7bd1
f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
fc5df1ee401a9bc520ead88b4f22e39f12f20d2a6f8ac865424b5fb37e9c1bab
fe495e0b91849474ec20925ae0c6627f35951a593488029e39a4474e826222e7
fede6818c6263dd5c9416e54bafb4c708a486e06452e38943301cc02dbae6a70