Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On December 20 via manual from CH

Summary

This website contacted 62 IPs in 9 countries across 43 domains to perform 250 HTTP transactions. The main IP is 2a00:13c8:f5::f:4b3d:148, 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
2 78 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
14 2a00:1450:400... 15169 (GOOGLE)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
18 172.217.21.194 15169 (GOOGLE)
1 99.84.92.30 16509 (AMAZON-02)
1 23.210.248.245 16625 (AKAMAI-AS)
3 9 23.37.53.21 16625 (AKAMAI-AS)
1 1 2600:9000:20e... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
3 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2.18.233.67 16625 (AKAMAI-AS)
4 2a00:1450:400... 15169 (GOOGLE)
3 13.224.199.29 16509 (AMAZON-02)
10 35.156.142.194 16509 (AMAZON-02)
1 2.18.234.21 16625 (AKAMAI-AS)
1 185.64.189.112 62713 (AS-PUBMATIC)
4 69.173.144.142 26667 (RUBICONPR...)
2 34.95.120.147 15169 (GOOGLE)
4 35.206.134.202 19527 (GOOGLE-2)
2 23.8.3.208 20940 (AKAMAI-ASN1)
1 37.157.6.252 198622 (ADFORM)
10 136.243.33.84 24940 (HETZNER-AS)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 142.93.164.216 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:20c... 16509 (AMAZON-02)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 6 2.18.234.72 16625 (AKAMAI-AS)
8 2a00:1450:400... 15169 (GOOGLE)
2 151.101.13.194 54113 (FASTLY)
6 88.99.5.37 24940 (HETZNER-AS)
2 52.216.8.37 16509 (AMAZON-02)
1 3 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:215... 16509 (AMAZON-02)
3 13.224.196.125 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
1 185.33.223.221 29990 (ASN-APPNEXUS)
1 1 172.217.18.162 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 199.166.0.26 7415 (ADSAFE-1)
1 2 172.217.22.6 15169 (GOOGLE)
2 199.166.0.32 7415 (ADSAFE-1)
5 104.244.39.20 7415 (ADSAFE-1)
1 2 89.163.159.103 24961 (MYLOC-AS)
1 194.213.222.29 5588 (GTSCE GTS...)
4 3.248.138.214 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
3 136.243.90.4 24940 (HETZNER-AS)
1 99.84.92.91 16509 (AMAZON-02)
1 89.163.159.125 24961 (MYLOC-AS)
1 2600:9000:20c... 16509 (AMAZON-02)
1 34.249.185.179 16509 (AMAZON-02)
1 52.209.100.206 16509 (AMAZON-02)
1 2.18.233.180 16625 (AKAMAI-AS)
1 23.37.55.184 16625 (AKAMAI-AS)
250 62
Apex Domain
Subdomains
Transfer
99 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
account.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
1 MB
26 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
ad.doubleclick.net
315 KB
16 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
261 KB
10 meetrics.net
lb33.s400.meetrics.net
3 KB
10 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
2 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
9 adsafeprotected.com
pixel.adsafeprotected.com
static.adsafeprotected.com
dt.adsafeprotected.com
91 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
6 googletagservices.com
www.googletagservices.com
172 KB
5 adscale.de
ih.adscale.de
js.adscale.de
8 KB
5 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
7 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 otto.de
orbidder.otto.de
1 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
60 KB
3 google-analytics.com
www.google-analytics.com
18 KB
3 amazon-adsystem.com
c.amazon-adsystem.com
29 KB
3 google.be
adservice.google.be
1 KB
3 ioam.de
script.ioam.de
de.ioam.de
13 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 googleapis.com
imasdk.googleapis.com
91 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 yieldlab.net
ad.yieldlab.net
1 KB
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 userreport.com
nugmw.userreport.com
sak.userreport.com
22 KB
2 mxcdn.net
s400.mxcdn.net
s385.mxcdn.net
51 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
581 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1 KB
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
1 2mdn.net
s0.2mdn.net
11 KB
1 adnxs.com
ib.adnxs.com
865 B
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 googletagmanager.com
www.googletagmanager.com
27 KB
1 adform.net
adx.adform.net
407 B
1 casalemedia.com
as-sec.casalemedia.com
900 B
1 google.com
adservice.google.com
323 B
1 nuggad.net
si.nuggad.net
539 B
1 yieldlove.com
cdn-a.yieldlove.com
84 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
60 KB
250 43
Domain Requested by
76 www.golem.de www.golem.de
cdn.stroeerdigitalgroup.de
www.googletagservices.com
18 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb33.s400.meetrics.net www.golem.de
10 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
9 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
8 tpc.googlesyndication.com securepubads.g.doubleclick.net
tpc.googlesyndication.com
8 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
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
5 dt.adsafeprotected.com www.golem.de
4 ih.adscale.de 2 redirects www.golem.de
js.adscale.de
4 orbidder.otto.de cdn-a.yieldlove.com
4 fastlane.rubiconproject.com cdn-a.yieldlove.com
4 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 ssl.1.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 c.amazon-adsystem.com cdn-a.yieldlove.com
c.amazon-adsystem.com
3 adservice.google.be securepubads.g.doubleclick.net
2 uss.xplosion.de www.golem.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 static.adsafeprotected.com www.golem.de
2 ad.doubleclick.net 1 redirects www.golem.de
2 pixel.adsafeprotected.com 1 redirects securepubads.g.doubleclick.net
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 s3.amazonaws.com www.golem.de
text
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 de.ioam.de 1 redirects www.golem.de
2 ad.yieldlab.net cdn-a.yieldlove.com
www.golem.de
2 ads.golem.de www.golem.de
2 golem.de 2 redirects
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 eu-u.openx.net cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
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 sak.userreport.com nugmw.userreport.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 cdn.stroeerdigitalmedia.de www.golem.de
1 s0.2mdn.net imasdk.googleapis.com
1 cm.g.doubleclick.net 1 redirects
1 ib.adnxs.com www.golem.de
1 cdn.radiantmediatechs.com www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 d.agkn.com js.agkn.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 cpx.golem.de www.golem.de
1 account.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 adx.adform.net cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 s385.mxcdn.net 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
250 71

This site contains links to these domains. Also see Links.

Domain
video.golem.de
forum.golem.de
redirect.golem.de
www.facebook.com
twitter.com
ads.golem.de
jobs.golem.de
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
*.g.doubleclick.net
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
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.be
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
*.google.com
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
orbidder.otto.de
Let's Encrypt Authority X3
2019-10-23 -
2020-01-21
3 months crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
meetrics.net
Let's Encrypt Authority X3
2019-12-03 -
2020-03-02
3 months 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-12-03 -
2020-02-25
3 months crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-12-18 -
2020-12-18
a year crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
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
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.storage.googleapis.com
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2019-12-03 -
2020-02-25
3 months crt.sh
*.adsafeprotected.com
COMODO RSA Domain Validation Secure Server CA
2018-08-20 -
2020-09-17
2 years crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-12-02 -
2020-03-01
3 months crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 22 frames:

Primary Page: https://www.golem.de/
Frame ID: 6AD8E45F3B75E6D2386536C010F42ACE
Requests: 211 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191205/r20190131/zrt_lookup.html
Frame ID: 13F3B6E712D3707CC9C8D2CCF3596DE5
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778964&bpp=15&bdt=254&fdt=246&idt=246&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=8701621367341&frm=20&pv=2&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3107231134449344&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3935&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=1&uci=a!1&btvi=1&fsb=1&xpc=cmODd2GECV&p=https%3A//www.golem.de&dtd=260
Frame ID: FCA4DA51E6628B57CF842F686FCAB3F8
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778979&bpp=8&bdt=269&fdt=317&idt=317&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725282860736&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4652&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=2&uci=a!2&btvi=2&fsb=1&xpc=6zVSfl26lN&p=https%3A//www.golem.de&dtd=320
Frame ID: 0E1316DF1BE34E77BBB94E115B798FA9
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=289030819&gdpr=1&gdpr_consent=&ref=&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: 1D9DC864C302551FE29F8BDD40C11B31
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=1576837779&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&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=1576837779106&bpp=4&bdt=396&fdt=341&idt=341&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725283056384&dssz=54&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=4&uci=a!4&fsb=1&dtd=350
Frame ID: 0153565C844BE8D1ACFA4FB52DEE5ACD
Requests: 1 HTTP requests in this frame

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss9T3Jqe1zBGuZdNe-RwYT4yZhNJq6ljmZz219ky5mG6a_Ix8PFgb386SJ5ma5xzyW3k5KNlebt9BBeXM2OCdt5xgMraqgwXgscT4jJpsS5AMQjlWHRcRXu4sdCKkc6EuW9I8XOE7myIgXbeRn6fqoiKjxtBvXqKNa5Bt60X1-8B7mHfACa4vBTCSwHIaytTQJNZaTtHo6CDJUKOR1E6ypZp4efiY1tjaJZh3JyDfwEYp_RvQhLAyY_251crhjJb_iea4o9IVyECEGNPT88fh0EQoxi&sai=AMfl-YS9Ss8wXqQfd9_gtqX7Ooc-uFZFNdXcZTkJKUAQftGR--944P2KtXPe8kjJcK3Ai7bRhoLHKB4ljhLKffadUEo1QsbJ3gu24NCFufBU5A&sig=Cg0ArKJSzCPoNtW_yAOcEAE&urlfix=1&adurl=
Frame ID: 44736D24093B40A9B1196B041FF981F2
Requests: 7 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstNJTbfSxotuP8Uaf5hOtD62Qe-APpEGR1BBJnHhf9g7BQaW7POfWDCtv10VsaYPV8us7SH7n75KzHw-3eZ3pv_D1a8BibsHBpFWaPPDGZJRWE3BfuCwUWAQFZlz3c3LKaGu63zNufDfMcr0vGD-P6Y_-GlFRCrDAQX8oXkSqa4n-qE26NRYB55WqCnCPzUDerbRav9cK-TSmvH6TUONwk-R19OOPi-SYogXdOt6jaWwtVodjpwbIfNbEt3z4LrjuzFjiRHBKn8_PHI1bJRyW8rjL-II34lNxf6hejRvbPJb7QuE0XayEVdu1EdAHWyXw&sai=AMfl-YRJX5AGscz4dDsDQ6maLhZqrrD3a-E_fkwrUlExi7GgN2romEz4GsN-hgwIB9RCcicPRjIr_pubbkzMNWTR-X3BlM3boT0XxfZ8rKcTgw&sig=Cg0ArKJSzCHeE6lr2QuoEAE&adurl=
Frame ID: 23D790797D1CB989E702660317005F79
Requests: 6 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv5t9fAR6DGMC_VAdI3bBqIvDLqyS_XzTiXgEv6laxx0_QQJk5rD0WcpmoSdGInIc50lg0ifEILW4Si91xjwa1FIr_Lj3pXmlPYIXxVLXcuroRv8_SiCQuGlS5XVH56Zh-Gxu_xLuzy_pOuEEGDlkNFpYaVGZDxQBQk4ZHCN4ezH6wqJQDb3jbLUeL_76u0dSw9ZfaPYj4OrDuB26N3JTv35DnLGgv26OSH9xTXrfhbf1zoH3w-IdRoDRG6dWDvbfNaKWDK42vmLr9fegV5Bsc0&sai=AMfl-YSnlDWJjFwH0rhgTfBJCA9b6Ld1F-4l7zPdoZtG__BPEwTqxR1FjVKYbVxbwjb6p-1S9aGZqdo-PG42rdHVBGj00-PYlmtXRwYR36Hnfg&sig=Cg0ArKJSzKkBWdHR7dg-EAE&urlfix=1&adurl=
Frame ID: 2B1D2D885BC402477B3F66D93055329F
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv6l7i1R5qzon_Vdn4PY-BV4WmjGyiW69DduwLvnGTJDWceaKCISRKiwuYqvuMLlxpXp_Cibu5QWzC5cK26V9rJahlRWuan1_bxggI4wbTIVgyGdtZ4yAFqZZtexOM3zh1WnVD2PAPLFt2YlLbj9kRnef5BHqjkkTb0AYVmms3aDqlSsEgU1clD31oocL-PcHm-A7upQRdyhTw6GwVXQGJyGv2HkYyfSNHhVFUFsdQPAF56JgsWbIzQqVkg0gUC_NTSvYPCU69GSqckCHj-JjfZC-86&sai=AMfl-YSqNeBmluIQxDUZBVlzaHEnzyP3VfzY0jLapwJmd6zvVULBDVlWbdRbqS12PJiEs3EvSdOynSP_T7uxyB8UH-wZTCxZuc3x8NkauURQwQ&sig=Cg0ArKJSzNAr7R4OV1poEAE&urlfix=1&adurl=
Frame ID: 9DD17ECCCE671EC9FE2318AC007028FB
Requests: 12 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstEfykhZjeHMMDbJXNihaBcD0M41r1xofYdtiFWhADPmYod1bZGf_Q9J0qozRIWyFHhtCFtG6qtdCWWTaIrM7_L2i4dq9IUTVH6aGTpU96k1hwKxnHDVrtur7SIz5HVzUgqUuMdpzo7ZsvdxLb6nw1EpQqCzLs22GzkKwa4ViFnGm8lzqzvMfkxXjSKOoTW2RD70I29aALuSGxS3DGJkryhvyqpJhqx-6uPmA7J10cO0zqL9mQXuP8otqUVJmtYgCUZWQkWcHAvXmLouT2P3S3CPyks&sai=AMfl-YRe2mxebZcl5h3aPVd49efsqKsygiN9p8oqjRnY5jfjZx9SId69hyGZ5oP3h4jwXmjjSEQ2S83IFgFQIq4mR3qEY1g_2zGPyxRxwQceAA&sig=Cg0ArKJSzGwlsFxy-9dCEAE&urlfix=1&adurl=
Frame ID: 2FA985AA550D61BABA061D7385F957D4
Requests: 9 HTTP requests in this frame

Frame: https://static.adsafeprotected.com/sca.17.4.114.js
Frame ID: 9038EA10E94ABDFB90ADEABA028496C7
Requests: 1 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/2019_9103_0123/CXPhone/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvqh81MilM8TFtxTMSLOnk5UfcrlcAKT6VEUTzQbxAY-xEzEbMFysC8N3WANezFROMo7cHZl-foyCbLjbeigvY_rDcIdAOLHZu4k0atvQQ8OYejP4odpRi_Ms69r3F0Yc6A7rUrSlutjFHqSnXelNITl4gybTU1Mvdg8_jXL9ywhrLb9c7z83sXq-UbcLWmwU36F5YHCSt0Rydq0eD8DZ3ZCQQAOtqeW9wFsj6AG285ST5acxX26YBuH1OKRWE3Ff3pytVv__-sXCPN9kTkbAYl%2526sai%253DAMfl-YRGRR5dBzz8m0qWQnsq7uBKFF8WuPptI1eDGGyCJVz6XfbAw0i-nUkdomYDb5TS5LHMmrrs67BJjL4j1FpeItDv04Sh307_dNemHrIgAw%2526sig%253DCg0ArKJSzJxe_hMPrJfdEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN69702.277556BUSINESSADNETWORK%2FB22994085.260876108%3Bdc_trk_aid%3D456784896%3Bdc_trk_cid%3D124983026%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D
Frame ID: 40262BACFC6670C73D3CCA6AC92C766F
Requests: 1 HTTP requests in this frame

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

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

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

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

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: C6D7CB2A83D68F7AFF9D30F1E6376884
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: F3BB650CAC06BF1683425A033C52AA11
Requests: 1 HTTP requests in this frame

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

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

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Page Statistics

250
Requests

100 %
HTTPS

37 %
IPv6

43
Domains

71
Subdomains

62
IPs

9
Countries

2921 kB
Transfer

6127 kB
Size

21
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://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 26
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 27
  • 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/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Request Chain 67
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&ep=1601847970&vr=415&id=sxnjyl&i3=000b8c67857a19fd15dfca292%3A1606472979071%3A1576837779071%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576837779071&n1=3&dntt=0&lt=1576837779072&ev=&cs=jlo3oy&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=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&ep=1601847970&vr=415&id=sxnjyl&i3=000b8c67857a19fd15dfca292%3A1606472979071%3A1576837779071%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576837779071&n1=3&dntt=0&lt=1576837779072&ev=&cs=jlo3oy&mo=1&sr=71
Request Chain 155
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1182326983&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=618682445&gjid=5785198&cid=325251954.1576837779&tid=UA-518800-2&_gid=484211286.1576837779&_r=1&gtm=2ouc61&z=819742724 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=325251954.1576837779&jid=618682445&_gid=484211286.1576837779&gjid=5785198&_v=j79&z=819742724
Request Chain 159
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=49cad897de870846ca57a040b84e4077&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D49cad897de870846ca57a040b84e4077%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=49cad897de870846ca57a040b84e4077&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D49cad897de870846ca57a040b84e4077%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=e93ee2e9865c446fb32ea3dc5efb8bdf HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=49cad897de870846ca57a040b84e4077&userId=adscale-user:e93ee2e9865c446fb32ea3dc5efb8bdf
Request Chain 160
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=49cad897de870846ca57a040b84e4077
Request Chain 161
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=ScrYl96HCEbKV6BAuE5Adw HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 162
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=49cad897de870846ca57a040b84e4077
Request Chain 179
  • https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua= HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_pre=CO6z9b2CxOYCFZnRdwoddKkBaQ;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
Request Chain 207
  • https://pixel.adsafeprotected.com/rfw/st/313194/41130583/skeleton.js?adsafe_url=https%3A%2F%2Fwww.golem.de%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:4ade05b8-c978-060f-6f2d-c3846638c6aa,c:xkR9ZX,sl:inView,em:true,fr:true,mn:app01ami,pt:1-5-15,wc:0.0.1600.1200,ac:1303.10.300.600,am:i,cc:1303.10.300.600,piv:99,obst:0,th:0,reas:,br:u,abv:na,an:n,oam:0,fm:rLbID11+1111|1112|12|1311|1312|14|15|161|17|18|19|1a*.313194-41130583|1b|1c|1d|1e,idMap:1a*,pl:,rend:0,renddet:WINDOW,rmeas:0,es:0,sc:1,ha:1,gmnp:0,for:1,b11:1,cnod:1,gm:0,tt:rjss,thd:1,et:18,oid:a0e626f1-2313-11ea-9d2e-00259086cc16,v:19.8.40,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 251
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWDJsWsR3BiwkWSUkWsfABifABSfABSfABifABifABfrr&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=4212865644418220734

250 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://golem.de/
  • https://www.golem.de/
189 KB
44 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2cfb19ad09fb12096701e1d4568d26aede44ee112e006a6df55f25d15198a73d
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
Sec-Fetch-Mode
navigate
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
Fri, 20 Dec 2019 10:29:38 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=Fri, 20-Dec-2019 22:29:38 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-6e31114a0b2eca74db3abbdae77fcd7d"
Content-Encoding
gzip
Vary
Accept-Encoding
X-UPSTREAM
unix:/var/run/php-fpm-www.sock

Redirect headers

Server
nginx
Date
Fri, 20 Dec 2019 10:29:38 GMT
Content-Type
text/html
Content-Length
178
Connection
keep-alive
Keep-Alive
timeout=3
Location
https://www.golem.de/
golem_main_135-min.css
www.golem.de/staticrl/styles/
76 KB
21 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_135-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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
61a1467b8f50a64d99427cd8819f6a72791767799707d7da7f5b10ff55f0e51e

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Fri, 15 Nov 2019 14:14:54 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
Mon, 20 Jan 2020 10:29:38 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
247 KB
60 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.3, , AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
e908b07ec50775b14993219f8fa69e640ae246969e2dcd78be0da72aedad92fa

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
Fri, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-amz-request-id
D58BBFEDE14EDFC0
status
200
access-control-max-age
86400
content-length
61339
x-amz-id-2
AAt9WMpGyms/1/Ii8tLSPb9LO2OKPG7iLV09qfIZC6cQVKcMHmxg3wzeb9RFThVjLUaUdbStsN4=
last-modified
Thu, 19 Dec 2019 16:17:46 GMT
server
KONICHIWA/1.0
etag
"77cb8afd4890bf2964b88fff96fb5bac"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=775
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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-e82"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145624-217429-217427_rc.jpg
www.golem.de/1912/
13 KB
14 KB
Image
General
Full URL
https://www.golem.de/1912/145624-217429-217427_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9460f76ac9c42f7dbff3d5128669909d30309c41eaa08582a86cd72403e431c8

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 20 Dec 2019 08:03:03 GMT
Server
nginx
ETag
"5dfc8037-35d3"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
13779
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145668-217624-217623_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145668-217624-217623_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1858ca76b1ca359bb47b5c7c52812dfebe7c45488c198b291dc29c55a4353129

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 20 Dec 2019 10:15:04 GMT
Server
nginx
ETag
"5dfc9f28-1a13"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6675
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145667-217621-217617_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145667-217621-217617_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0b382ab83bf70e7a2d27d75c78761ec005ccb9d4f6a945174a2b52256bef781a

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 20 Dec 2019 10:00:03 GMT
Server
nginx
ETag
"5dfc9ba3-1f4f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8015
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145642-217514-217511_rc.jpg
www.golem.de/1912/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1912/145642-217514-217511_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5c265425e9dfa5ff1bc3730a3f7e05f359943444d1b5d0e7d9bffe044e92ee6

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Thu, 19 Dec 2019 11:00:03 GMT
Server
nginx
ETag
"5dfb5833-16c8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5832
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145665-217616-217613_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145665-217616-217613_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5e148f89fc2e2cd6d7b6d7f9178d8b5331ef618a76718177495700bbe4fab13f

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 20 Dec 2019 09:44:03 GMT
Server
nginx
ETag
"5dfc97e3-1ac9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6857
Expires
Mon, 20 Jan 2020 10:29:38 GMT
137474-178092-178089_rc.jpg
www.golem.de/1811/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1811/137474-178092-178089_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
161795485799eec430715bcc2ded43849db8473da12b5986f40a2f4f84b86cfe

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 02 Nov 2018 06:25:03 GMT
Server
nginx
ETag
"5bdbedbf-f71"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3953
Expires
Mon, 20 Jan 2020 10:29:38 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=1576836543&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

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, 20 Dec 2019 10:29:38 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
headshot-plugin-fuer-schnelle-3d-charaktererstellung-(herstellervideo).jpg
video.golem.de/teaser/1/1/23899/thumb-high-1000/
67 KB
68 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23899/thumb-high-1000/headshot-plugin-fuer-schnelle-3d-charaktererstellung-(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
c956736e31133e8d1196517b56afb898963225bc543c39f351da21f2f8cfb53c

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Wed, 18 Dec 2019 09:14:47 GMT
Server
nginx
ETag
"5df9ee07-10df3"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
69107
Expires
Mon, 20 Jan 2020 10:29:38 GMT
top-gun-maverick-trailer.jpg
video.golem.de/teaser/1/1/23891/thumb-high-1000/
40 KB
40 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23891/thumb-high-1000/top-gun-maverick-trailer.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
486d4d6f315fd46143ff30ef3199086fae315cab2a5c2ad76b825180d64745e4

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Tue, 17 Dec 2019 06:45:56 GMT
Server
nginx
ETag
"5df879a4-a057"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
41047
Expires
Mon, 20 Jan 2020 10:29:38 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=1576837441&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

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, 20 Dec 2019 10:29:38 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
145572-217266-217265_rc.jpg
www.golem.de/1912/
61 KB
61 KB
Image
General
Full URL
https://www.golem.de/1912/145572-217266-217265_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
341dab5884908aff253104b309d86cee673f4c9bbc94a97fad0932209b657f73

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Tue, 17 Dec 2019 11:11:03 GMT
Server
nginx
ETag
"5df8b7c7-f408"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
62472
Expires
Mon, 20 Jan 2020 10:29:38 GMT
145459-217150-217147_rc.jpg
www.golem.de/1912/
56 KB
56 KB
Image
General
Full URL
https://www.golem.de/1912/145459-217150-217147_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ffdc5ea426aa6f0541b67822b87b963cb379bdda847e6e54edc0de71c81f2023

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 16 Dec 2019 11:34:05 GMT
Server
nginx
ETag
"5df76bad-df76"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
57206
Expires
Mon, 20 Jan 2020 10:29:38 GMT
191212-golem_Seminar_Kubernetes_Jan20_FFM.jpg
www.golem.de/_img/
38 KB
38 KB
Image
General
Full URL
https://www.golem.de/_img/191212-golem_Seminar_Kubernetes_Jan20_FFM.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:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
341ae8b7babc44d0c3bcf125b6fe8ea3a0a58f3e124b517a311ea01b5dc4da23

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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Fri, 13 Dec 2019 17:41:37 GMT
Server
nginx
ETag
"5df3cd51-9690"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
38544
Expires
Mon, 20 Jan 2020 10:29:38 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:38 GMT
longread-swiper_133-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_133-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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:38 GMT
account_js_rl19_1_1.php
www.golem.de/abo/
4 KB
3 KB
Script
General
Full URL
https://www.golem.de/abo/account_js_rl19_1_1.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:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
16ed47f1cd79f4b87625326a7befd9b70374e4ac4d1b3ca9a5018db0741320aa

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Fri, 20 Dec 2019 10:29:38 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
Wed, 21 Oct 2015 16:29:00 PDT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
104 KB
38 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:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
68bcdec2fdc6ce23468b97a8c39a3f9eb86233e03be5072bf3b438ac1433714d
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
37933
x-xss-protection
0
server
cafe
etag
2924851815849280674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 20 Dec 2019 10:29:38 GMT
golem_csi-133-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-133-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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:38 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

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, 20 Dec 2019 10:29:38 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
Mon, 20 Jan 2020 10:29:38 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 000b
Resource Hash
567f8dc3b549b7fad44fe2378ed8e2bcd4a58ad69f0c74991773db9be9e41022

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Last-Modified
Fri, 20 Dec 2019 10:29:38 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000b
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Fri, 20 Dec 2019 12:29:38 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: 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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
8194ff3826976ab39199703c90dca9ddec292bfe5033e69e473f76b7fb8742e5
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"372 / 864 of 1000 / last-modified: 1576520981"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15828
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:38 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
272 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
99.84.92.30 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-92-30.muc50.r.cloudfront.net
Software
/ Express
Resource Hash
c2bd1d15393ba9fc013d05d11272c46ab92eb6997515be049e92f0c4b751371a

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
Fri, 20 Dec 2019 09:30:56 GMT
content-encoding
gzip
x-amz-cf-pop
MUC50-C1
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
access-control-allow-origin
*
x-amz-cf-id
Hojw95MO_EYpRO3pT7aHytrkGHXyjwCI3w3lPr7vSDjap_ojLjvGAQ==
via
1.1 4699c08b44211e17f977ca0133ec5e8f.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: 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
23.210.248.245 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-248-245.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

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
Fri, 20 Dec 2019 10:29:38 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49772
Expires
Fri, 20 Dec 2019 12:29:38 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
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
Fri, 20 Dec 2019 10:29:38 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Fri, 20 Dec 2019 10:29:38 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/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/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/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/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/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/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:3a00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
6b7cd7d7128fc70ea412ee9b7fbdb59391ee00ebfc630425b8ee8293e19fff93

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
Fri, 20 Dec 2019 10:29:38 GMT
via
1.1 9128c49d19c76fd86ec4c647434ccb0a.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=86400, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1796
x-amz-cf-id
hNw_CoooImhJlzVgz8RUUvE3p7K0qcsR04KRG-lenNRbI0MpkzVCIQ==

Redirect headers

date
Fri, 20 Dec 2019 10:29:38 GMT
via
1.1 29051585a13addd312c8ac9d527433c6.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C1
location
https://nugmw.userreport.com/rc-ap/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
access-control-allow-methods
get, post, options
status
302
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
o1D-GC5Urn95d2BI1mZg2VTgy92fL2RdAFfaFaG4pbSjIX1nErkWuQ==
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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:38 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:38 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:38 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:38 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
truncated
/
768 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5

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-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-6624"
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
26148
Expires
Mon, 20 Jan 2020 10:29:38 GMT
dmp
tracking.m6r.eu/sync/
97 B
600 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.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
939e4ab32c7e889de75d48c3de57a2765fea4a87126c5864567855f87eeda1a7

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

Response headers

Date
Fri, 20 Dec 2019 10:29:38 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
108
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: 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-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
Fri, 20 Dec 2019 10:29:38 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-b0e"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Mon, 20 Jan 2020 10:29:38 GMT
integrator.js
adservice.google.be/adsid/
109 B
778 B
Script
General
Full URL
https://adservice.google.be/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:81a::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

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, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
323 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:81d::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

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, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:38 GMT
%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstart...
s385.mxcdn.net/679600/
2 KB
2 KB
XHR
General
Full URL
https://s385.mxcdn.net/679600/%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbillboard2,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fposterad,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle2
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/1.10.3 /
Resource Hash
219f49b2af994cde3eb82ab621b6d01a71d2a8ed765524af5f47b1984f44e4bd

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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx/1.10.3
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range
Cache-Control
max-age=63841
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
1880
Expires
Sat, 21 Dec 2019 04:13:40 GMT
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=9944313389793258&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

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, 20 Dec 2019 10:29:38 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
Mon, 20 Jan 2020 10:29:38 GMT
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/
225 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
20cdda5f0e51f5dac5693ffe15fb394528dd838e9887a785de1d02e3bb2a418f
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
86385
x-xss-protection
0
server
cafe
etag
4513681422076315165
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 20 Dec 2019 10:29:38 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191205/r20190131/ Frame 13F3
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191205/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:81e::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/r20191205/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
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
sec-fetch-mode
nested-navigate
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
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
Thu, 19 Dec 2019 17:43:23 GMT
expires
Thu, 02 Jan 2020 17:43:23 GMT
content-type
text/html; charset=UTF-8
etag
13309989325511048345
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6574
x-xss-protection
0
cache-control
public, max-age=1209600
age
60375
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: 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
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9

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
Fri, 20 Dec 2019 06:22:41 GMT
content-encoding
gzip
server
Server
age
30711
etag
6bed68e25cc35021d570267b56047ef8
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
x-amz-cf-id
mQWgiZw1tESYKfQ0m2HbIcE0odul21_I3M-pKD0fuTWxSW47_LZmbg==
via
1.1 d8eef512ab23f23f549b4cd25ac5328d.cloudfront.net (CloudFront)
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
cygnus
as-sec.casalemedia.com/
24 B
900 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=335654&v=7.2&r=%7B%22id%22%3A%221a1ed0152d3c91%22%2C%22imp%22%3A%5B%7B%22id%22%3A%222a127e49e124ad%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%2234632388df1ba1%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%2248df7b2d5c43ab%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%2253509bffd98a0c%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%226305a3d1148d89%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%227c7b2e985c2d39%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%22822d263aa7599f%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%229e04b340a57993%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%22104e2b251964279%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%22115c8531e5caefa%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%22124ed6f0b8f1da%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%2213afaed57bfa3a3%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
03f3c24797882a0a503a4894f5edc07240bb847f9e8c780995a6e2249b4c4302

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 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
44
Expires
Fri, 20 Dec 2019 10:29:39 GMT
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

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

Response headers

status
204
date
Fri, 20 Dec 2019 10:29:39 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349738&size_id=15&p_pos=btf&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=59570ed3-5e21-4963-99ce-2d151297117d&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.9184560772165373
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, RSA, AES_128_GCM
Server
69.173.144.142 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
6e0f0ea93b23784d6d0abff3fbd6cda425f402fe5a22195462528d5621831dd4

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=45
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1218740&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=atf&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=1264fa1e-0bb6-451a-a2a0-66be8a33dec6&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.9732913869512678
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, RSA, AES_128_GCM
Server
69.173.144.142 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
0f196ef81107574f30fb9656eec9a3b59bb27b9d1e82e1a2ce94280527cca46d

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=296
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349732&size_id=15&alt_size_ids=10&p_pos=btf&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=0776db69-396d-4e37-a7cf-a12b3f0802dd&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.3611424333752038
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, RSA, AES_128_GCM
Server
69.173.144.142 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
40dfdbe8a6004a5a45aa80c9bd700a691a1a3af3a8b9ef215710ae3a4ce957f6

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=472
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
261 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349674&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=atf&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=6b49b522-6dd8-45a9-bd76-e2478f16c1c8&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.14332061198877688
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, RSA, AES_128_GCM
Server
69.173.144.142 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
3e24778e9a0c3bb90e05c47658563961ec59598d21e7851f8227c351b45e76d7

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=494
Content-Length
261
Expires
Wed, 17 Sep 1975 21:32:10 GMT
arj
yieldlove-d.openx.net/w/1.0/
11 KB
2 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=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=59570ed3-5e21-4963-99ce-2d151297117d%2C1264fa1e-0bb6-451a-a2a0-66be8a33dec6%2C0776db69-396d-4e37-a7cf-a12b3f0802dd%2C6b49b522-6dd8-45a9-bd76-e2478f16c1c8%2C3cb30d8c-1459-49d6-a138-6645c3eafc72&nocache=1576837779039&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.173.0 /
Resource Hash
0e9dcadab8503e54c51795e42a2eec8c29f52b5cf47ad4776621bf92e8f90a6e

Request headers

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

Response headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
server
OXGW/16.173.0
status
200
vary
Accept, Accept-Encoding
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
1227
via
1.1 google
expires
Mon, 26 Jul 1997 05:00:00 GMT
bid
orbidder.otto.de/
1 KB
866 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
acedd4f604359b5a406494a55b27a73c47ce9413aafeaaab25a97a5cf7660200
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
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

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

Response headers

status
204
date
Fri, 20 Dec 2019 10:29:39 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

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

Response headers

status
204
date
Fri, 20 Dec 2019 10:29:39 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

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

Response headers

status
204
date
Fri, 20 Dec 2019 10:29:39 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
0

9767285,9767287,9767288
ad.yieldlab.net/yp/
2 B
760 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/9767285,9767287,9767288?ts=1576837779040&json=true
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
23.8.3.208 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-3-208.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
p3p
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
28
Expires
Thu, 19 Dec 2019 10:29:39 GMT
/
adx.adform.net/adx/
10 B
407 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPTEyNjRmYTFlLTBiYjYtNDUxYS1hMmEwLTY2YmU4YTMzZGVjNg%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPTZiNDliNTIyLTZkZDgtNDVhOS1iZDc2LWUyNDc4ZjE2YzFjOA%3D%3D&pt=gross&stid=bc049d0b-e658-42fc-b120-5968d796f369&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.6.252 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
s1.adform.net
Software
nginx /
Resource Hash
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3

Request headers

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

Response headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:39 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
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
submit
lb33.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb33.s400.meetrics.net/bb-mx/submit?//skpBTAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSpBDPAAAAAAAAAOAAAAGCAAAAAAZwSpBDBRksFAQtjFfvjuSA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 20 Dec 2019 10:29:38 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpCUAAATkzFARksFAQtjFGwJNSA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:38 GMT
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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&e...
  • 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=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&ep=16...
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=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&ep=1601847970&vr=415&id=sxnjyl&i3=000b8c67857a19fd15dfca292%3A1606472979071%3A1576837779071%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576837779071&n1=3&dntt=0&lt=1576837779072&ev=&cs=jlo3oy&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 003a
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
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 003a
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 003a
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
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=BE%2FBrussels+Hoofdstedelijk+Gewest&cb=000b&i2=000b8c67857a19fd15dfca292&ep=1601847970&vr=415&id=sxnjyl&i3=000b8c67857a19fd15dfca292%3A1606472979071%3A1576837779071%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1576837779071&n1=3&dntt=0&lt=1576837779072&ev=&cs=jlo3oy&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Thu, 20 Dec 2018 10:29:39 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
142.93.164.216 Frankfurt am Main, Germany, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:32:01 GMT
Server
nginx
ETag
W/"5c7d1ac1-11e36"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Wed, 27 Nov 2019 12:53:10 GMT
js
www.googletagmanager.com/gtag/
73 KB
27 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:81e::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
0c39c021ffc08f13cc0f38f80996cc76081317c2ef84c217904b9d7fa7244feb
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
br
last-modified
Fri, 20 Dec 2019 09:00:00 GMT
server
Google Tag Manager
access-control-allow-origin
http://www.googletagmanager.com
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
content-length
27812
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 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:20c3:1e00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

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, 19 Dec 2019 20:24:22 GMT
via
1.1 ac90d46be219b2aa8a23e6982405715d.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
50718
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
MUC50-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
krwRbzLwMTx3adugFuJxDo2q4vDr9mM0FtExyRXAAt441ncy9aTY2Q==
ping
account.golem.de/
0
0
Script
General
Full URL
https://account.golem.de/ping?callback=jQuery22405017848836261729_1576837778949&_=1576837778950
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:180 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/
Resource Hash

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

access-control-allow-origin
*
Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Cache-Control
private, no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
-1
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
2a00:13c8:f5::f:4b3d:148 , 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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:39 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:39 GMT
puma-snap.jpg
video.golem.de/teaser/1/1/23900/thumb-high-1000/
62 KB
62 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23900/thumb-high-1000/puma-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
973a95841cafe3d3d6293ce2a6dfe568f1b32c1ccd98896af88cd6a9d55aa03f

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 09:52:37 GMT
Server
nginx
ETag
"5dfb4865-f879"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63609
Expires
Mon, 20 Jan 2020 10:29:39 GMT
teardown-spiel-mit-voxelgrafik-zerstoerbarer-umgebung-und-raytracing.jpg
video.golem.de/teaser/1/1/23861/thumb-high-1000/
80 KB
80 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23861/thumb-high-1000/teardown-spiel-mit-voxelgrafik-zerstoerbarer-umgebung-und-raytracing.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
589250dba43180fe0cf7501aba948265021df9e22aa1fb7c8730cbb9103311d2

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 08:15:19 GMT
Server
nginx
ETag
"5def5417-13e92"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
81554
Expires
Mon, 20 Jan 2020 10:29:39 GMT
porsche-x-star-wars-8220the-designer-alliance8221.jpg
video.golem.de/teaser/1/1/23894/thumb-high-1000/
90 KB
91 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23894/thumb-high-1000/porsche-x-star-wars-8220the-designer-alliance8221.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
4b1d78db550a701f7c288f2d22a38e80832bad8172f80807a4b39d2107cfcbbe

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 17 Dec 2019 11:04:29 GMT
Server
nginx
ETag
"5df8b63d-169b2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
92594
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145656-217577-217573_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145656-217577-217573_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
890b5e85d2e2e663f3dd8c35a28cd1f4ec98824d1cc8c2c651b5d17ce4eb1f47

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 16:25:03 GMT
Server
nginx
ETag
"5dfba45f-1c61"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7265
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145636-217490-217487_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145636-217490-217487_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
40cd26898c72ca6fac8634371e748332a1bf9dacc066cfcce9117b3d9d553f8f

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 09:25:03 GMT
Server
nginx
ETag
"5dfb41ef-2081"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8321
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145620-217409-217406_rc.jpg
www.golem.de/1912/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1912/145620-217409-217406_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
94780b14d25642b1c9a4528f29af5abb7a6a5e0ce25c1f4e5c324f087c28bda9

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 18 Dec 2019 12:57:03 GMT
Server
nginx
ETag
"5dfa221f-162a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5674
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145664-217610-217604_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145664-217610-217604_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3389e55442a43bb1e5b47075b1019a42b5f35218f3c544a4add1b5350af760aa

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Fri, 20 Dec 2019 09:01:03 GMT
Server
nginx
ETag
"5dfc8dcf-1e05"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7685
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145424-216702-216699_rc.jpg
www.golem.de/1912/
10 KB
11 KB
Image
General
Full URL
https://www.golem.de/1912/145424-216702-216699_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
22947d33cea928b0ad0ceaac7b7deb0329ba19f4a4e98bc6f4046cc36e5aabb2

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 11:03:04 GMT
Server
nginx
ETag
"5dfb58e8-28f6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10486
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145661-217598-217597_rc.jpg
www.golem.de/1912/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145661-217598-217597_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3ed83fa144ae381e68baecc9859c226a43718f2771544ac5e947804200e5e776

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Fri, 20 Dec 2019 08:15:03 GMT
Server
nginx
ETag
"5dfc8307-19b5"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6581
Expires
Mon, 20 Jan 2020 10:29:39 GMT
144210-210459-210456_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144210-210459-210456_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f33117eacda2949088a603d0f749027c248306843cfee539d101afca48d52bea

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 02 Oct 2019 06:00:03 GMT
Server
nginx
ETag
"5d943ce3-15d8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5592
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145618-217397-217394_rc.jpg
www.golem.de/1912/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1912/145618-217397-217394_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c85a16dbb29515430f9e59a1a762defe4c0497a7801bdd83b4506b5159d5c3ea

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 18 Dec 2019 10:41:03 GMT
Server
nginx
ETag
"5dfa023f-108b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4235
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145606-217338-217337_rc.jpg
www.golem.de/1912/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145606-217338-217337_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4d16df06e185292468ddbd4a0fa1849da97793ae198952508aa8df37400fe342

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 18 Dec 2019 08:01:04 GMT
Server
nginx
ETag
"5df9dcc0-2524"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9508
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145658-217590-217587_rc.jpg
www.golem.de/1912/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1912/145658-217590-217587_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
52f7d126984a43d18fd6d72cd55df768f17d35cdc84868b13383264c2a111cc5

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 17:36:03 GMT
Server
nginx
ETag
"5dfbb503-1006"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4102
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145657-217586-217583_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145657-217586-217583_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
215d53c74530f835304166b261caa9b4bd12efbb1aac70acad19e42699bd0919

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 16:40:03 GMT
Server
nginx
ETag
"5dfba7e3-1e26"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7718
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145655-217572-217569_rc.jpg
www.golem.de/1912/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1912/145655-217572-217569_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e6e385435428543fd06add4b6b1fc76beaffbcdeaffb361412d7209e266f6015

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 16:10:03 GMT
Server
nginx
ETag
"5dfba0db-14b0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5296
Expires
Mon, 20 Jan 2020 10:29:39 GMT
137702-179115-179112_rc.jpg
www.golem.de/1811/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1811/137702-179115-179112_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
411e7dabb047d60b82157a39bb20dcd2c26c5cd975fb63d9244634b72688e098

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 14 Nov 2018 08:02:03 GMT
Server
nginx
ETag
"5bebd67b-135b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4955
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145651-217568-217565_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145651-217568-217565_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1557c9ca8e17910f64f1eaf109db6b308665f2b58b8684271f8f225ca416f41d

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 15:41:04 GMT
Server
nginx
ETag
"5dfb9a10-1a81"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6785
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145484-216761-216755_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145484-216761-216755_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5039af429db1b523504beca97de1c1e5d7364cfb29b2b6b61da336412c726b9a

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 18 Dec 2019 11:00:04 GMT
Server
nginx
ETag
"5dfa06b4-2821"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10273
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145652-217564-217561_rc.jpg
www.golem.de/1912/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145652-217564-217561_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c26cbb4d7d73c4f49aebc612c01d789ad4f1aeed4192a7c551d923e8b11c26ce

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 15:21:03 GMT
Server
nginx
ETag
"5dfb955f-1d6e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7534
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145649-217560-217557_rc.jpg
www.golem.de/1912/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1912/145649-217560-217557_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3dde182739c95eb8f9a9051bab684d8e9747bc2a239ddcafed4f82a00fd19204

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 15:06:03 GMT
Server
nginx
ETag
"5dfb91db-1ef1"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7921
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145650-217555-217552_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145650-217555-217552_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
faff9bde8c15fa486bcca769e03da822cc9fa87a0cb09eaa9d7060372fe7f8f6

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 14:46:03 GMT
Server
nginx
ETag
"5dfb8d2b-2751"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10065
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145646-217542-217539_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/145646-217542-217539_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8501ff65b7e75cdd2d8cb5432f8df851b13c49b23b81d5f6d8f1baa5751e5f8d

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 13:45:03 GMT
Server
nginx
ETag
"5dfb7edf-284c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10316
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145647-217536-217533_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145647-217536-217533_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e97ee856bdc72dfb4dd1768660b42200b117c21185c8368e9a39ac7374710402

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 13:37:03 GMT
Server
nginx
ETag
"5dfb7cff-1bd2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7122
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145645-217532-217529_rc.jpg
www.golem.de/1912/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145645-217532-217529_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
93d618a89924c2667da76663637c9cb84f5be59d11cee8af7dd9838070178a59

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 13:20:03 GMT
Server
nginx
ETag
"5dfb7903-217a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8570
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145643-217525-217524_rc.jpg
www.golem.de/1912/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1912/145643-217525-217524_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5ed29e1bfc44507f3f926973f447fa508f5f76d2fa88e7ebfdcacc3804a9362f

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 12:57:03 GMT
Server
nginx
ETag
"5dfb739f-1617"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5655
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145584-217215-217212_rc.jpg
www.golem.de/1912/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1912/145584-217215-217212_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9798eae2384e93ba3ad0fa97d27aba91e2e412a4f0ea7d9aa7b8194d183dc6aa

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 17 Dec 2019 08:23:03 GMT
Server
nginx
ETag
"5df89067-218e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8590
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145641-217510-217507_rc.jpg
www.golem.de/1912/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1912/145641-217510-217507_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
390874d6db4a9ee5befa54c41837eca509cb512ebba5fedac48bf6b57bc99710

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 10:50:03 GMT
Server
nginx
ETag
"5dfb55db-14af"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5295
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145535-216970-216966_rc.jpg
www.golem.de/1912/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1912/145535-216970-216966_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ea6ad04bab31cc9c22814f1a3120e6edaaa8b0def84ff0d9fee4c0505ca9c6ea

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 08:32:04 GMT
Server
nginx
ETag
"5dfb3584-1575"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5493
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145640-217506-217503_rc.jpg
www.golem.de/1912/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145640-217506-217503_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d1de02f0667d44eeab1d2bfed8752ce3884aac56125a63db58a54700e987b6d4

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 19 Dec 2019 10:40:03 GMT
Server
nginx
ETag
"5dfb5383-1b98"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7064
Expires
Mon, 20 Jan 2020 10:29:39 GMT
145486-216854-216851_rc.jpg
www.golem.de/1912/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1912/145486-216854-216851_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
44fc6a9636497db1460c3dd74fc5905a0d43efdab8ce9e733cc0ba49d9ff231a

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 16 Dec 2019 12:01:05 GMT
Server
nginx
ETag
"5df77201-18e9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6377
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145365-216301-216299_rc.jpg
www.golem.de/1912/
29 KB
30 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145365-216301-216299_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2bec3ec9a90f2e8999d3a0706c688cc14cef96fee8915fa68149dfeece8c2ccf

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Fri, 13 Dec 2019 11:04:04 GMT
Server
nginx
ETag
"5df37024-74ed"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29933
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145065-216887-216885_rc.jpg
www.golem.de/1912/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145065-216887-216885_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
54fcd04765ef279ee48e861ddb168cf571f982bea184f4d451f13fc6bd1dca03

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Fri, 13 Dec 2019 09:45:05 GMT
Server
nginx
ETag
"5df35da1-5b93"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23443
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145440-216556-216554_rc.jpg
www.golem.de/1912/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145440-216556-216554_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
beb288c285e4af9d8a2def3afe35254b0e473eec16817ecf0cbd810216fa1335

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 11 Dec 2019 07:55:05 GMT
Server
nginx
ETag
"5df0a0d9-57c8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22472
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145493-216764-216762_rc.jpg
www.golem.de/1912/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145493-216764-216762_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9858ff0aa66a5803c9646b127a01d4faf597a17fcd305adc514124b1bb8163be

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 12 Dec 2019 11:05:05 GMT
Server
nginx
ETag
"5df21ee1-5142"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20802
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145383-216685-216683_rc.jpg
www.golem.de/1912/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145383-216685-216683_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b97a1beae92e51ce5c90e7eac829cf070cfea51f1df4b03863d5f89697f64d11

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Wed, 11 Dec 2019 11:03:04 GMT
Server
nginx
ETag
"5df0cce8-5c9b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23707
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145495-216781-216779_rc.jpg
www.golem.de/1912/
22 KB
23 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145495-216781-216779_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3d56a84c01b4ef4168492a20787afab2d53432c0c985dfd7610dc419d1751580

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 12 Dec 2019 14:00:04 GMT
Server
nginx
ETag
"5df247e4-5906"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22790
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145349-216187-216185_rc.jpg
www.golem.de/1912/
35 KB
36 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145349-216187-216185_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
02c362c3d7e4841addf4d931d2048ece57aa4bdc76a33694bb5a7aeea2d1b8b9

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 09 Dec 2019 07:59:05 GMT
Server
nginx
ETag
"5dedfec9-8dfe"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
36350
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145428-211817-211815_rc.jpg
www.golem.de/1912/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145428-211817-211815_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
76e1f44da6cd35daa7938a205092e0cc4560e8cf2b24249b9dce3743123375d3

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 13:40:04 GMT
Server
nginx
ETag
"5defa034-57bb"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22459
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145340-216439-216437_rc.jpg
www.golem.de/1912/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145340-216439-216437_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3d651deccdbf9555ab9e4174f8d6d43fe5fb40fc74380dda6e9ad3b9c39b085c

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 09 Dec 2019 11:01:04 GMT
Server
nginx
ETag
"5dee2970-4723"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18211
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145399-216510-216508_rc.jpg
www.golem.de/1912/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145399-216510-216508_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d4d2956a2b4f4e52d5d5a78b038aa3586bca0788f89924e2a0c3ffd61e3a2765

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 06:00:04 GMT
Server
nginx
ETag
"5def3464-5260"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21088
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145382-216752-216750_rc.jpg
www.golem.de/1912/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145382-216752-216750_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6bb4ed6f0ab117491217d63a3e7292fe41d9950d0eb015c0c39a56cf0cf07d10

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 12 Dec 2019 08:23:04 GMT
Server
nginx
ETag
"5df1f8e8-459b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17819
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145435-216482-216480_rc.jpg
www.golem.de/1912/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145435-216482-216480_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
921d2930dec16635e5b3efee4f21844bc10b8f42f81abb0b89589e9ab8b73b33

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 11:04:05 GMT
Server
nginx
ETag
"5def7ba5-5f71"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24433
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145355-216195-216193_rc.jpg
www.golem.de/1912/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145355-216195-216193_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
64484f3feac9b54f1e55dd2f98213eeeba00cb8372b5172615239f554577d3b2

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 05 Dec 2019 11:12:04 GMT
Server
nginx
ETag
"5de8e604-2767"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10087
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145198-215292-215290_rc.jpg
www.golem.de/1912/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145198-215292-215290_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7207dcdc68b43142844cfef7d74159fa32f94650d5f116272fb3fe19f56b5ff7

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 08:04:04 GMT
Server
nginx
ETag
"5def5174-7478"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29816
Expires
Mon, 20 Jan 2020 10:29:39 GMT
sp_145446-216519-216517_rc.jpg
www.golem.de/1912/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1912/sp_145446-216519-216517_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
66139eb6b84d9595b190aef89ed6775c83d0335bba775ce91459f2975b3bba6b

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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Tue, 10 Dec 2019 07:00:04 GMT
Server
nginx
ETag
"5def4274-5167"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20839
Expires
Mon, 20 Jan 2020 10:29:39 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1576837779&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
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

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

X-Cnection
close
Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Fri, 20 Dec 2019 10:29:39 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
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 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=3&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.3, , 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

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, 20 Dec 2019 10:29:39 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
Fri, 20 Dec 2019 10:29:39 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.3, , 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

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, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Thu, 19 Dec 2019 16:35:15 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
Sat, 21 Dec 2019 10:29:39 GMT
ads
securepubads.g.doubleclick.net/gampad/
389 B
694 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=264724944775425&correlator=82670577125996&output=ldjh&impl=fifs&adsid=NT&eid=21062414%2C21062819%2C21063145&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191220&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D49cad897de870846ca57a040b84e4077%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%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-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn117-2%252Cn86-1%252Cn147-1%252Cn64-0%252Cn119-5%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-0%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1576837779&dt=1576837779196&dlt=1576837778710&idt=442&frm=20&biw=1585&bih=1200&oid=3&adxs=393&adys=2817&adks=3874908706&ucis=1&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=49&icsg=855431320764096&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x450&msz=1000x450&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&fws=0&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
bc69c49d32fa2730ef2de74fec9d64232ee024b7b1ca51ee170d335ea5726680
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
203
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_2019121002.js
securepubads.g.doubleclick.net/gpt/
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
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

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

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

ads
googleads.g.doubleclick.net/pagead/ Frame FCA4
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778964&bpp=15&bdt=254&fdt=246&idt=246&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=8701621367341&frm=20&pv=2&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3107231134449344&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3935&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=1&uci=a!1&btvi=1&fsb=1&xpc=cmODd2GECV&p=https%3A//www.golem.de&dtd=260
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778964&bpp=15&bdt=254&fdt=246&idt=246&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&correlator=8701621367341&frm=20&pv=2&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3107231134449344&dssz=50&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=3935&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=1&uci=a!1&btvi=1&fsb=1&xpc=cmODd2GECV&p=https%3A//www.golem.de&dtd=260
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
cross-site
sec-fetch-mode
nested-navigate
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
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
Fri, 20 Dec 2019 10:29:39 GMT
server
cafe
content-length
25776
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 20-Dec-2019 10:44:39 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Fri, 20 Dec 2019 10:29:39 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.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
sffe /
Resource Hash
63890326f558587b0840eb0a6e6377f1bf39264e015e568f4c2a03aefce3f929
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29463
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
sp_gTZi-100700_rc.jpg
www.golem.de/7655/
68 B
463 B
Image
General
Full URL
https://www.golem.de/7655/sp_gTZi-100700_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

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
Fri, 20 Dec 2019 10:29:39 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
rmpslider-rl_133-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_133-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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187

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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:39 GMT
config.js
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
46 KB
11 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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
84ad88a69de55847b9f5210b36b7040c716eeb643d29938d2d05e0a7764310d4

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Age
2849
X-Cache
HIT
Connection
keep-alive
Content-Length
10542
x-amz-id-2
nZCqie/LzbMn6Yf8F5n7lOH75S6lco79ckbjC7WwZ0bhRopSieiX2vW/DzzhmVjtOLrYmhE/yXE=
X-Served-By
cache-fra19166-FRA
Last-Modified
Fri, 20 Dec 2019 09:00:16 GMT
Server
AmazonS3
X-Timer
S1576837779.346150,VS0,VE0
ETag
"9d34aceb0c286558700c64513eb9d374"
x-amz-request-id
49AD372B6A4377C0
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
186
ads
googleads.g.doubleclick.net/pagead/ Frame 0E13
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778979&bpp=8&bdt=269&fdt=317&idt=317&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725282860736&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4652&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=2&uci=a!2&btvi=2&fsb=1&xpc=6zVSfl26lN&p=https%3A//www.golem.de&dtd=320
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1576837779&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1576837778979&bpp=8&bdt=269&fdt=317&idt=317&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725282860736&dssz=52&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=4652&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=144&bc=31&ifi=2&uci=a!2&btvi=2&fsb=1&xpc=6zVSfl26lN&p=https%3A//www.golem.de&dtd=320
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
cross-site
sec-fetch-mode
nested-navigate
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
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
Fri, 20 Dec 2019 10:29:39 GMT
server
cafe
content-length
25895
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 20-Dec-2019 10:44:39 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Fri, 20 Dec 2019 10:29:39 GMT
cache-control
private
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

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

Response headers

date
Thu, 19 Dec 2019 15:43:06 GMT
content-encoding
gzip
vary
Origin
age
67594
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 3bf3e75bcb9a86b3eb343a1d4392a6df.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
xgk11jQ5UrXeRsdId4fwbXH8FG-pjApdg7u1KFJYUSlbmJzqm_GlbQ==
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/
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
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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/
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
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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/
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
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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/
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
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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"
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/
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
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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"
bid
c.amazon-adsystem.com/e/dtb/
23 B
370 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3505&u=https%3A%2F%2Fwww.golem.de%2F&pid=aHOYGD6Vlf0TF&cb=0&ws=1600x1200&v=7.45.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22120x600%22%2C%22200x600%22%2C%22301x601%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_1%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_1%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_2%22%7D%2C%7B%22sd%22%3A%223%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_4%22%7D%2C%7B%22sd%22%3A%224%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x250_2%22%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
745a085b52b8371ec6705413fca70a28c6d8bff0db480e6b124bd08c54e95ef8

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
via
1.1 d8eef512ab23f23f549b4cd25ac5328d.cloudfront.net (CloudFront)
server
Server
x-amz-cf-pop
FRA2-C1
status
200
vary
User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
23
x-amz-cf-id
uJAKAugp9jKz9FJnGkKJGWkRbMCCydr3fk0JqPUxZZm5CEh1AELCwg==
/
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:369b34dee.54f4c6e95_1576837779338,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1576837779340
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 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=20&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=369b34dee.54f4c6e95_1576837779338&1576837779341
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

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
Fri, 20 Dec 2019 10:29:39 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:369b34dee.54f4c6e95_1576837779338,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=369b34dee.54f4c6e95_1576837779338&1576837779348
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 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:369b34dee.54f4c6e95_1576837779338,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1576837779349
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 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
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
701 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.8.37 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

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

Response headers

Date
Fri, 20 Dec 2019 10:29:40 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
49C535CB3F82A993
Content-Length
53
x-amz-id-2
GGAuiH1PwWFnkOrc4UukFAGwF3dcnfrz2ivGAkHtJt6XgkEAra+1WpbJRalali23VaOftWSbXMU=
Last-Modified
Fri, 20 Dec 2019 05:35:06 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
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

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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Thu, 14 Nov 2019 17:36:22 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
2a00:13c8:f5::f:4b3d:148 , 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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:39 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

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
6962
date
Fri, 20 Dec 2019 08:33:37 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Fri, 20 Dec 2019 10:33:37 GMT
sp_gTZi-867990_rc.jpg
www.golem.de/8320/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/8320/ad-time/sp_gTZi-867990_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

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
Fri, 20 Dec 2019 10:29:39 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_gTZi-274570_rc.jpg
www.golem.de/4075/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/4075/ad-time/sp_gTZi-274570_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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

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
Fri, 20 Dec 2019 10:29:39 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
/
d.agkn.com/iframe/8613/ Frame 1D9D
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=289030819&gdpr=1&gdpr_consent=&ref=&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
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:4800:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=289030819&gdpr=1&gdpr_consent=&ref=&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
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
cross-site
sec-fetch-mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
482
cache-control
no-cache, must-revalidate
date
Fri, 20 Dec 2019 10:29:38 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%3Awrhmv6Jwb7Evh%2F0hMAk%2FhMpvt8UgmEb%2B;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlj18TJY9fEwAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
x-cache
Miss from cloudfront
via
1.1 1d87c34bb2f20fda8e0841bc33179769.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
iDzji0XMqrpV8fZVqsdAa0tc_LjbYhY4UtJqq6UOrlgYwPIzYKRC2Q==
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
ads
securepubads.g.doubleclick.net/gampad/
64 KB
13 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=264724944775425&correlator=82670577125996&output=ldjh&impl=fifs&adsid=NT&eid=21062414%2C21062819%2C21063145&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191220&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&prev_iu_szs=10x40%7C10x30%7C10x20%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C1000x150%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17298.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17295.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17299.scenario%253Adefault%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%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A18494.scenario%253Adefault%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%2C100-1_75%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17300.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D49cad897de870846ca57a040b84e4077%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-1%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%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-1%252Cn160-0%252Cn107-0%252Cn21-1%252Cn117-2%252Cn86-1%252Cn147-1%252Cn64-0%252Cn119-5%252Cn18-1%252Cn161-0%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-3%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-1%252Cn82-1%252Cn33-1%252Cn84-0%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1576837779&dt=1576837779439&dlt=1576837778710&idt=442&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C1138&adys=0%2C130%2C748%2C1280%2C3899&adks=3876328335%2C1956608835%2C2740773112%2C366944190%2C2251274322&ucis=2%7C3%7C4%7C5%7C6&ifi=6&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=53&icsg=3107231134449344&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x12&msz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x10&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&fws=0%2C0%2C0%2C0%2C0&ohw=0%2C0%2C0%2C0%2C0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
dbae80178f38cc9ba775c5b35b7323bc6e045e3aa1dec103c1c87a4205494e90
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-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-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
13313
x-xss-protection
0
google-lineitem-id
5221132496,5214894648,5194673165,4980490284,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138296752574,138295853697,138290413938,138263655552,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
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=0&n121=1&n116=0&n104=1&n15=1&n155=1&n106=1&n52=2&n153=1&n11=1&n120=3&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=1&n160=0&n107=0&n21=1&n117=2&n86=1&n147=1&n64=0&n119=5&n18=1&n161=0&n126=1&n92=1&n62=1&n57=1&n77=0&n83=0&n102=1&n105=0&n159=0&n20=1&n80=0&n12=6&n141=0&n157=1&n99=1&n128=2&n118=6&n85=1&n9=3&n6=2&n63=0&n58=1&n38=2&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=3&n90=1&n43=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=0&n91=0&n46=1&n114=1&n69=0&n10=1&n3=1&n82=1&n33=1&n84=0&n5=5&n109=0&n122=1&n67=0&n115=1&n89=1&n123=1&n17=1&n78=0&n44=1&n81=1&n88=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.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0ae5cdcd006a2469999e2896564c3994df320948c609cf7b481d8a94354e6db3

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1514
ads
googleads.g.doubleclick.net/pagead/ Frame 0153
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1576837779&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&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=1576837779106&bpp=4&bdt=396&fdt=341&idt=341&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725283056384&dssz=54&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=4&uci=a!4&fsb=1&dtd=350
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191205/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
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=1576837779&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344%2C40%3A32&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=1576837779106&bpp=4&bdt=396&fdt=341&idt=341&shv=r20191205&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=8701621367341&frm=20&pv=1&ga_vid=325251954.1576837779&ga_sid=1576837779&ga_hid=1182326983&ga_fc=0&iag=0&icsg=3421725283056384&dssz=54&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065126&oid=3&pvsid=264724944775425&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=4&uci=a!4&fsb=1&dtd=350
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
cross-site
sec-fetch-mode
nested-navigate
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
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
Fri, 20 Dec 2019 10:29:39 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Fri, 20-Dec-2019 10:44:39 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-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Fri, 20 Dec 2019 10:29:39 GMT
cache-control
private
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
311 B
1000 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.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

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

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Via
1.1 eb83e7e264681d87a86c9b6a2159e502.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
1
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
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
CmxjlmQbN10by_fqHsbDvJB3XkQUHjNBuheU4RxESTbaTHrTNzn3rQ==
Expires
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201912111527/
31 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201912111527/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.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
610f7772eaba86e5daa5311a03ad90fce900deb1cf93453334100640d90bd5e2

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Age
585
X-Cache
HIT
Connection
keep-alive
Content-Length
11563
x-amz-id-2
W681byj/ihHkPYC6b1i3qCIgjy2Too8UPJID48DpVLRr2l60eh8KHdOmF0TCyqKWYqBtK+76K6s=
X-Served-By
cache-fra19166-FRA
Last-Modified
Thu, 12 Dec 2019 15:48:13 GMT
Server
AmazonS3
X-Timer
S1576837779.473865,VS0,VE0
ETag
"da73881f5b9af91d074c623ce31000ca"
x-amz-request-id
67E29347A80E8C0F
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
915
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1182326983&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=325251954.1576837779&jid=618682445&_gid=484211286.1576837779&gjid=5785198&_v=j79&z=819742724
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=325251954.1576837779&jid=618682445&_gid=484211286.1576837779&gjid=5785198&_v=j79&z=819742724
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
access-control-allow-origin
*
date
Fri, 20 Dec 2019 10:29:39 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:39 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=325251954.1576837779&jid=618682445&_gid=484211286.1576837779&gjid=5785198&_v=j79&z=819742724
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
411
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
100 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1182326983&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=514&_u=IAhAAUAB~&jid=&gjid=&cid=325251954.1576837779&tid=UA-518800-2&_gid=484211286.1576837779&gtm=2ouc61&z=1158050070
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

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
Wed, 20 Nov 2019 05:30:36 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
2609943
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
6 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=438010
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
6fba68ac9345123605b8512151a8120eb95780ca36f1edb74c910d3683066794
Security Headers
Name Value
X-Content-Type-Options nosniff

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
1841
cf-ray
5480efba39c5cba4-VIE
status
200
last-modified
Mon, 16 Dec 2019 11:39:01 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
Fri, 20 Dec 2019 11:29:39 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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Nov 2019 17:08:48 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
Mon, 20 Jan 2020 10:29:39 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=49cad897de870846ca57a040b84e4077&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D49cad897de870846ca57a040b84e4077%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=49cad897de870846ca57a040b84e4077&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D49cad897de870846ca57a040b84e4077%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=49cad897de870846ca57a040b84e4077&userId=adscale-user:e93ee2e9865c446fb32ea3dc5efb8bdf
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=49cad897de870846ca57a040b84e4077&userId=adscale-user:e93ee2e9865c446fb32ea3dc5efb8bdf
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.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
Fri, 20 Dec 2019 10:29:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=49cad897de870846ca57a040b84e4077&userId=adscale-user:e93ee2e9865c446fb32ea3dc5efb8bdf
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Fri, 20 Dec 2019 10:29:39 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=49cad897de870846ca57a040b84e4077
43 B
865 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=49cad897de870846ca57a040b84e4077
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.221 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
316.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
Fri, 20 Dec 2019 10:29:41 GMT
AN-X-Request-Uuid
a9a20f5f-c0f8-4479-ba48-02013bc6be19
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
82.102.19.133; 82.102.19.133; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.247:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=49cad897de870846ca57a040b84e4077
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=ScrYl96HCEbKV6BAuE5Adw
  • 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.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.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
Fri, 20 Dec 2019 10:29:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:39 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=49cad897de870846ca57a040b84e4077
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=49cad897de870846ca57a040b84e4077
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
23.8.3.208 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-3-208.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
x-frame-options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
x-xss-protection
1; mode=block
x-application-context
application
Expires
Thu, 19 Dec 2019 10:29:39 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=49cad897de870846ca57a040b84e4077
Date
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
hd-main.js
hgc-cf-cache-1.svonm.com/
196 KB
58 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=YTwNbYUaOw
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.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
bd6099688ed9ad6c658a6b58312e04073a7d75bd070d02e3a1b69eb6612727cf

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

Response headers

Date
Fri, 20 Dec 2019 10:29:15 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
25
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://www.golem.de
Last-Modified
Thu, 19 Dec 2019 17:13:58 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 eb83e7e264681d87a86c9b6a2159e502.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
Krdq98cqGdW_dvLIT0rmlwQkCp6xS86QuPVtan5ZHqEXwreTlkEI2A==
ima3.js
imasdk.googleapis.com/js/sdkloader/
267 KB
91 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:808::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
918c4485a28931feb333074355c2f4c2e915ffa51fe70b8797e9432c37b22b8f
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
92690
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 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
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-44b"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Mon, 20 Jan 2020 10:29:39 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_135-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
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-39c"
Content-Type
image/png
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Mon, 20 Jan 2020 10:29:39 GMT
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
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

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
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:39 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.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:148 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

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
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Fri, 20 Dec 2019 10:29:39 GMT
Last-Modified
Mon, 11 Nov 2019 17:08:48 GMT
Server
nginx
ETag
"5dc995a0-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
Mon, 20 Jan 2020 10:29:39 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=369b34dee.54f4c6e95_1576837779338&1576837779629
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:39 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
truncated
/
196 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bd6099688ed9ad6c658a6b58312e04073a7d75bd070d02e3a1b69eb6612727cf

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
bridge3.355.3_de.html
imasdk.googleapis.com/js/core/ Frame 5941
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.355.3_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:808::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.355.3_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
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
sec-fetch-mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
196471
date
Fri, 20 Dec 2019 09:26:42 GMT
expires
Sat, 19 Dec 2020 09:26:42 GMT
last-modified
Tue, 10 Dec 2019 22:57:51 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
3777
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
client.js
s0.2mdn.net/instream/video/
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:821::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

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, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10523
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
123 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&pvsid=264724944775425&r=10x40%7C10x30%7C10x20%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&w=300&h=600
Requested by
Host: www.golem.de
URL: https://www.golem.de/
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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 4473
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss9T3Jqe1zBGuZdNe-RwYT4yZhNJq6ljmZz219ky5mG6a_Ix8PFgb386SJ5ma5xzyW3k5KNlebt9BBeXM2OCdt5xgMraqgwXgscT4jJpsS5AMQjlWHRcRXu4sdCKkc6EuW9I8XOE7myIgXbeRn6fqoiKjxtBvXqKNa5Bt60X1-8B7mHfACa4vBTCSwHIaytTQJNZaTtHo6CDJUKOR1E6ypZp4efiY1tjaJZh3JyDfwEYp_RvQhLAyY_251crhjJb_iea4o9IVyECEGNPT88fh0EQoxi&sai=AMfl-YS9Ss8wXqQfd9_gtqX7Ooc-uFZFNdXcZTkJKUAQftGR--944P2KtXPe8kjJcK3Ai7bRhoLHKB4ljhLKffadUEo1QsbJ3gu24NCFufBU5A&sig=Cg0ArKJSzCPoNtW_yAOcEAE&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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
skeleton.js
pixel.adsafeprotected.com/rjss/st/313194/41130583/ Frame 4473
201 KB
68 KB
Script
General
Full URL
https://pixel.adsafeprotected.com/rjss/st/313194/41130583/skeleton.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.26 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.pixel.adsafeprotected.com
Software
nginx /
Resource Hash
5d6e627eebfb92573a88334e7660ecfafad7eeac686575010fa072a52abd07f0

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
Fri, 20 Dec 2019 10:29:39 GMT
Content-Encoding
gzip
X-Server-Name
app01ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
pixel.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
B22994085.260876108;dc_pre=CO6z9b2CxOYCFZnRdwoddKkBaQ;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/ Frame 4473
Redirect Chain
  • https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=...
  • https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_pre=CO6z9b2CxOYCFZnRdwoddKkBaQ;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=...
42 B
120 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_pre=CO6z9b2CxOYCFZnRdwoddKkBaQ;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.6 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s14-in-f6.1e100.net
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
location
https://ad.doubleclick.net/ddm/trackimp/N69702.277556BUSINESSADNETWORK/B22994085.260876108;dc_pre=CO6z9b2CxOYCFZnRdwoddKkBaQ;dc_trk_aid=456784896;dc_trk_cid=124983026;ord=468065554;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 4473
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 23D7
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstNJTbfSxotuP8Uaf5hOtD62Qe-APpEGR1BBJnHhf9g7BQaW7POfWDCtv10VsaYPV8us7SH7n75KzHw-3eZ3pv_D1a8BibsHBpFWaPPDGZJRWE3BfuCwUWAQFZlz3c3LKaGu63zNufDfMcr0vGD-P6Y_-GlFRCrDAQX8oXkSqa4n-qE26NRYB55WqCnCPzUDerbRav9cK-TSmvH6TUONwk-R19OOPi-SYogXdOt6jaWwtVodjpwbIfNbEt3z4LrjuzFjiRHBKn8_PHI1bJRyW8rjL-II34lNxf6hejRvbPJb7QuE0XayEVdu1EdAHWyXw&sai=AMfl-YRJX5AGscz4dDsDQ6maLhZqrrD3a-E_fkwrUlExi7GgN2romEz4GsN-hgwIB9RCcicPRjIr_pubbkzMNWTR-X3BlM3boT0XxfZ8rKcTgw&sig=Cg0ArKJSzCHeE6lr2QuoEAE&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
window_focus.js
tpc.googlesyndication.com/pagead/js/r20191205/r20110914/client/ Frame 23D7
2 KB
1 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20191205/r20110914/client/window_focus.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0b1ace9b39cfa2f3de9ebd25c2b2e2b44816502e53809093d2c53dc2898f4d83
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Thu, 19 Dec 2019 17:58:01 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
59498
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1126
x-xss-protection
0
server
cafe
etag
5070557177101173266
vary
Accept-Encoding, Origin
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Thu, 02 Jan 2020 17:58:01 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 23D7
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
10795963140608864386
tpc.googlesyndication.com/simgad/ Frame 23D7
101 KB
101 KB
Image
General
Full URL
https://tpc.googlesyndication.com/simgad/10795963140608864386
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c0afa784e198c08ebe4c79cb9d2f98e0fa407af8738b58f1d7b26f8658c05ed0
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Mon, 02 Dec 2019 06:54:01 GMT
x-content-type-options
nosniff
age
1568138
x-dns-prefetch-control
off
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
103284
x-xss-protection
0
last-modified
Wed, 27 Nov 2019 16:59:32 GMT
server
sffe
content-type
image/jpeg
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 01 Dec 2020 06:54:01 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 2B1D
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv5t9fAR6DGMC_VAdI3bBqIvDLqyS_XzTiXgEv6laxx0_QQJk5rD0WcpmoSdGInIc50lg0ifEILW4Si91xjwa1FIr_Lj3pXmlPYIXxVLXcuroRv8_SiCQuGlS5XVH56Zh-Gxu_xLuzy_pOuEEGDlkNFpYaVGZDxQBQk4ZHCN4ezH6wqJQDb3jbLUeL_76u0dSw9ZfaPYj4OrDuB26N3JTv35DnLGgv26OSH9xTXrfhbf1zoH3w-IdRoDRG6dWDvbfNaKWDK42vmLr9fegV5Bsc0&sai=AMfl-YSnlDWJjFwH0rhgTfBJCA9b6Ld1F-4l7zPdoZtG__BPEwTqxR1FjVKYbVxbwjb6p-1S9aGZqdo-PG42rdHVBGj00-PYlmtXRwYR36Hnfg&sig=Cg0ArKJSzKkBWdHR7dg-EAE&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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2B1D
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
imgad
tpc.googlesyndication.com/pagead/ Frame 2B1D
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_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::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

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
Wed, 18 Dec 2019 19:19:10 GMT
x-content-type-options
nosniff
server
cafe
age
141029
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
public, max-age=604800
content-type
image/jpeg
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24989
x-xss-protection
0
expires
Wed, 25 Dec 2019 19:19:10 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 9DD1
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv6l7i1R5qzon_Vdn4PY-BV4WmjGyiW69DduwLvnGTJDWceaKCISRKiwuYqvuMLlxpXp_Cibu5QWzC5cK26V9rJahlRWuan1_bxggI4wbTIVgyGdtZ4yAFqZZtexOM3zh1WnVD2PAPLFt2YlLbj9kRnef5BHqjkkTb0AYVmms3aDqlSsEgU1clD31oocL-PcHm-A7upQRdyhTw6GwVXQGJyGv2HkYyfSNHhVFUFsdQPAF56JgsWbIzQqVkg0gUC_NTSvYPCU69GSqckCHj-JjfZC-86&sai=AMfl-YSqNeBmluIQxDUZBVlzaHEnzyP3VfzY0jLapwJmd6zvVULBDVlWbdRbqS12PJiEs3EvSdOynSP_T7uxyB8UH-wZTCxZuc3x8NkauURQwQ&sig=Cg0ArKJSzNAr7R4OV1poEAE&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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 9DD1
51 KB
16 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_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
8194ff3826976ab39199703c90dca9ddec292bfe5033e69e473f76b7fb8742e5
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"372 / 731 of 1000 / last-modified: 1576520981"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15828
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 9DD1
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
view
securepubads.g.doubleclick.net/pcs/ Frame 2FA9
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstEfykhZjeHMMDbJXNihaBcD0M41r1xofYdtiFWhADPmYod1bZGf_Q9J0qozRIWyFHhtCFtG6qtdCWWTaIrM7_L2i4dq9IUTVH6aGTpU96k1hwKxnHDVrtur7SIz5HVzUgqUuMdpzo7ZsvdxLb6nw1EpQqCzLs22GzkKwa4ViFnGm8lzqzvMfkxXjSKOoTW2RD70I29aALuSGxS3DGJkryhvyqpJhqx-6uPmA7J10cO0zqL9mQXuP8otqUVJmtYgCUZWQkWcHAvXmLouT2P3S3CPyks&sai=AMfl-YRe2mxebZcl5h3aPVd49efsqKsygiN9p8oqjRnY5jfjZx9SId69hyGZ5oP3h4jwXmjjSEQ2S83IFgFQIq4mR3qEY1g_2zGPyxRxwQceAA&sig=Cg0ArKJSzGwlsFxy-9dCEAE&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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.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
Fri, 20 Dec 2019 10:29:39 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 2FA9
51 KB
16 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_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
8194ff3826976ab39199703c90dca9ddec292bfe5033e69e473f76b7fb8742e5
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"372 / 559 of 1000 / last-modified: 1576520981"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15828
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2FA9
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_2019121002.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
sffe /
Resource Hash
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1575654529893506"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29272
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:39 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
truncated
/ Frame 23D7
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2d2dce68b4ab7522b416b88e176ab10d7518c302d96423fb65ffc35e8ae88ae0

Request headers

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

Response headers

Content-Type
image/png
truncated
/ Frame 2B1D
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
aa40665e25d45a876858f4262728780b62ab2a06d2a760b7a7c1f948c0d6f2e2

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
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpDAOAAKktFLkqFFlqwF23A52AwwALl1FDtw3Fw1F0lFgzE0yFlhFtpFunFLw2FCgw4FBBFLkqFKlkyB23A52AwwA2qoFx1A32A4zA33A34A12AwtE56FunFywB4yA5BF/k0FhEmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A5zAyBELlnFBUkzFnBPaBAAZAwSAcAAAAPaMAAAAAAAB0znAPBAAFAA0znTYeNAPBAAhPAwPABYeNAZCAAOA55A55A85B55A58E55A55AGAx2AzwA2wArYeNASksF8FjAAAAAAAAAAAAEAAA0znAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4ExyA1BEMAxzA4yA5wA0xAz5Az4AGAkpFylFj0FAAAAJAx0A15A12A33A1BEKA1xA50A23AzxA21AJAylFj0FhuFnsFlBFKA1xA50A23AzxA21AKA1xA50A23AzxA21A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAwPAsEA9BAFAAAYeNAAAAARA4tB1uFruFv3FutBzwAw4ExyA1BEAAAAAAAAAAAAAAAAQtjFxQS/UA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:38 GMT
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 9DD1
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
integrator.sync.js
adservice.google.be/adsid/ Frame 9DD1
113 B
178 B
Script
General
Full URL
https://adservice.google.be/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:81a::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

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, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
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.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-53-21.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
Fri, 20 Dec 2019 10:29:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 2FA9
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.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.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:39 GMT
integrator.sync.js
adservice.google.be/adsid/ Frame 2FA9
113 B
175 B
Script
General
Full URL
https://adservice.google.be/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:81a::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

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, 20 Dec 2019 10:29:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
skeleton.js
static.adsafeprotected.com/ Frame 4473
Redirect Chain
  • https://pixel.adsafeprotected.com/rfw/st/313194/41130583/skeleton.js?adsafe_url=https%3A%2F%2Fwww.golem.de%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:4ade05b8-c978-060f-6f2d-c3846638c6aa,c:xkR9ZX,sl:in...
  • 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
Fri, 20 Dec 2019 10:29:40 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app04ami.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
Fri, 20 Dec 2019 10:29:40 GMT
X-Server-Name
app01ami.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.114.js
static.adsafeprotected.com/ Frame 9038
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.114.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
ad9ae0374e0334d2511e951a2381a164fa87ce86594fc027d25a8624774c3c96

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
Fri, 20 Dec 2019 10:29:40 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Dec 2019 17:39:36 GMT
X-Server-Name
app04ami.ami.303net.pvt
ETag
"5df129d8-5052"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20562
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 GMT
index.html
cdn.stroeerdigitalmedia.de/Ads/2019_9103_0123/CXPhone/ Frame 4026
0
0
Document
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/2019_9103_0123/CXPhone/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvqh81MilM8TFtxTMSLOnk5UfcrlcAKT6VEUTzQbxAY-xEzEbMFysC8N3WANezFROMo7cHZl-foyCbLjbeigvY_rDcIdAOLHZu4k0atvQQ8OYejP4odpRi_Ms69r3F0Yc6A7rUrSlutjFHqSnXelNITl4gybTU1Mvdg8_jXL9ywhrLb9c7z83sXq-UbcLWmwU36F5YHCSt0Rydq0eD8DZ3ZCQQAOtqeW9wFsj6AG285ST5acxX26YBuH1OKRWE3Ff3pytVv__-sXCPN9kTkbAYl%2526sai%253DAMfl-YRGRR5dBzz8m0qWQnsq7uBKFF8WuPptI1eDGGyCJVz6XfbAw0i-nUkdomYDb5TS5LHMmrrs67BJjL4j1FpeItDv04Sh307_dNemHrIgAw%2526sig%253DCg0ArKJSzJxe_hMPrJfdEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN69702.277556BUSINESSADNETWORK%2FB22994085.260876108%3Bdc_trk_aid%3D456784896%3Bdc_trk_cid%3D124983026%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

:method
GET
:authority
cdn.stroeerdigitalmedia.de
:scheme
https
:path
/Ads/2019_9103_0123/CXPhone/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsvqh81MilM8TFtxTMSLOnk5UfcrlcAKT6VEUTzQbxAY-xEzEbMFysC8N3WANezFROMo7cHZl-foyCbLjbeigvY_rDcIdAOLHZu4k0atvQQ8OYejP4odpRi_Ms69r3F0Yc6A7rUrSlutjFHqSnXelNITl4gybTU1Mvdg8_jXL9ywhrLb9c7z83sXq-UbcLWmwU36F5YHCSt0Rydq0eD8DZ3ZCQQAOtqeW9wFsj6AG285ST5acxX26YBuH1OKRWE3Ff3pytVv__-sXCPN9kTkbAYl%2526sai%253DAMfl-YRGRR5dBzz8m0qWQnsq7uBKFF8WuPptI1eDGGyCJVz6XfbAw0i-nUkdomYDb5TS5LHMmrrs67BJjL4j1FpeItDv04Sh307_dNemHrIgAw%2526sig%253DCg0ArKJSzJxe_hMPrJfdEAE%2526urlfix%253D1%2526adurl%253Dhttps://ad.doubleclick.net%2Fddm%2Ftrackclk%2FN69702.277556BUSINESSADNETWORK%2FB22994085.260876108%3Bdc_trk_aid%3D456784896%3Bdc_trk_cid%3D124983026%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D
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
cross-site
sec-fetch-mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

status
200
server
Apache
etag
"7b41019b8e1179ea287c7757bcfa44fe:1575543902"
last-modified
Thu, 05 Dec 2019 11:05:02 GMT
accept-ranges
bytes
content-type
text/html
vary
Accept-Encoding
content-encoding
gzip
content-length
714
cache-control
max-age=86400
expires
Sat, 21 Dec 2019 10:29:40 GMT
date
Fri, 20 Dec 2019 10:29:40 GMT
access-control-max-age
86400
access-control-allow-credentials
false
access-control-allow-headers
*
access-control-allow-methods
GET,HEAD
access-control-allow-origin
*
truncated
/ Frame 4473
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f667d52d276680beb7ae41ef52bf3379d4f85fbf128c7a6ecc0fc86665561eec

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
ads
securepubads.g.doubleclick.net/gampad/ Frame 9DD1
296 B
198 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3378926742266280&correlator=737610389051795&output=ldjh&impl=fif&eid=21065202%2C21065307&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191220&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%2522browserapp%2522%253A%255B%2522chrome%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%252249cad897de870846ca57a040b84e4077%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%252C%2522100-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-1%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-3%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-1%2522%252C%2522n160-0%2522%252C%2522n107-0%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-1%2522%252C%2522n147-1%2522%252C%2522n64-0%2522%252C%2522n119-5%2522%252C%2522n18-1%2522%252C%2522n161-0%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-3%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-1%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-0%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-0%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-1%2522%252C%2522n123-1%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-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_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A18494.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%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_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D818ea5ba530e3073%3AT%3D1576837779%3AS%3DALNI_Ma4c2QPxP6VN6PrltPPzQ8I88YVVw&cdm=www.golem.de&bc=31&abxe=1&lmt=1576837780&dt=1576837780056&dlt=1576837779863&idt=187&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=251&oid=3&adx=308&ady=1540&adk=2408324468&uci=iu3gin1ml12w&ifi=1&ifk=1555408520&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.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=325251954.1576837779&ga_sid=1576837780&ga_hid=1599644213&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
d382b4823d3a796fdb42d1edce45989ef4ea9c41825b31e2c8aabc5aae20b888
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
121
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_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 9DD1
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24811
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:40 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 9DD1
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

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

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

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
ads
securepubads.g.doubleclick.net/gampad/ Frame 2FA9
300 B
203 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2151935487235012&correlator=3280732442815027&output=ldjh&impl=fif&eid=21064758&vrg=2019121002&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20191220&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%2522browserapp%2522%253A%255B%2522chrome%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%252249cad897de870846ca57a040b84e4077%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%252C%2522100-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-1%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-3%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-1%2522%252C%2522n160-0%2522%252C%2522n107-0%2522%252C%2522n21-1%2522%252C%2522n117-2%2522%252C%2522n86-1%2522%252C%2522n147-1%2522%252C%2522n64-0%2522%252C%2522n119-5%2522%252C%2522n18-1%2522%252C%2522n161-0%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-3%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-1%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-0%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-0%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-1%2522%252C%2522n123-1%2522%252C%2522n17-1%2522%252C%2522n78-0%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-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_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A17300.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%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_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D818ea5ba530e3073%3AT%3D1576837779%3AS%3DALNI_Ma4c2QPxP6VN6PrltPPzQ8I88YVVw&cdm=www.golem.de&bc=31&abxe=1&lmt=1576837780&dt=1576837780069&dlt=1576837779886&idt=178&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adx=993&ady=4390&adk=4008869679&uci=f8q7f28kxz9l&ifi=1&ifk=4200391111&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.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=325251954.1576837779&ga_sid=1576837780&ga_hid=675668382&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
1d75226b9c3a814cd603242c75eb0ef9574e5e796f68b96ca579ee13c2bad1ec
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
126
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_2019121002.js
securepubads.g.doubleclick.net/gpt/ Frame 2FA9
64 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24811
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:40 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 2FA9
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

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

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

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
dt
dt.adsafeprotected.com/
43 B
308 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=313194&asId=4ade05b8-c978-060f-6f2d-c3846638c6aa&tv={c:xkRa1f,pingTime:-2,time:98,type:a,im:{sf:0,pom:1,prf:{mdA:4,mdZ:115,beA:137,beZ:138,mfA:140,cmA:140,inA:141,inZ:144,prA:144,prZ:150,si:155,poA:155,poZ:170,cmZ:170,mfZ:170,loA:190,loZ:192,ltA:234,ltZ:234}},sca:{dfp:{df:4,sz:300.600,dom:iframe}},env:{gca:0},clog:[{piv:99,vs:i,r:,w:300,h:600,t:17}],es:0,sc:1,ha:1,gmnp:0,for:1,b11:1,cnod:1,gm:0,slTimes:{i:98,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1303.10.300.600,am:i,cc:1303.10.300.600,piv:99,obst:0,th:0,reas:,bkn:{piv:[93~75],as:[93~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rLbID11+1111|1112|12|1311|1312|14|15|161|17|18|19|1a*.313194-41130583|1b|1c|1d|1e,idMap:1a*,rend:0,renddet:WINDOW,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-sky,skyscraper,bannerTopWrapper],sinceFw:78,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.39.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
amidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Fri, 20 Dec 2019 10:29:40 GMT
X-Server-Name
dt14ami.ami.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
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpEdQAA/k0F1ImvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A5zAymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B02A53Ax1Az4A44AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAx0A45A02A04AmjEpkF9xAz4Ay5A14A1zA25A3mAzpF6lF95A3wA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA04A50A20A4mAhwFk9B1yAx0A45A02A04AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A50AyBELlnFCUkzF2BPGAAAAAAAABuF5APBAAFAAuF5Tl5/APAAA0EAMCABl5/AZCAAOA55A55A85B55A58E55A55AGAyzAz4Az4Arl5/APKCAhPAwPAHYeNAPAAA0EAMCAHl5/ASksFkFjAAAAAAAAAAAAEAAAuF5AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA51A41Az2A53AGAkpFylFj0FAAAAKA02A53Ax1Az4A44AKA1yAx0A45A02A04AGAihFuuFlyFKA1yAx0A45A02A04AKA1yAx0A45A02A04A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFd0EAMCAKPA6DAFAAAl5/AAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFB3ilWA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpFeQAA/k0FXNmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A5zAymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B02A53Ax1Az4A44AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAx0A45A02A04AmjEpkF9xAz4Ay5A14A1zA25A3mAzpF6lF95A3wA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA04A50A20A4mAhwFk9B1yAx0A45A02A04AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A50AymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxwAwBELlnFDTkzFPPRAAAAAAAABSi1ASksFCFjAAAAAAAAAAAAEAAASi1AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBQtjF7rxAZA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpGlQAAUkzFYBPAAAFAASi1TbosAPAAA0EAEYABbosAZBAAOA55A55A85B55A58E55A55AGAyxA5yA4yArbosAPCAA0EAEYAHbosARksF6d0EAEYAKPA7DAFAAAbosAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFP5IRSA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpHlQAA/k0F/RmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A5zAymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B02A53Ax1Az4A44AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAx0A45A02A04AmjEpkF9xAz4Ay5A14A1zA25A3mAzpF6lF95A3wA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA04A50A20A4mAhwFk9B1yAx0A45A02A04AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A50AymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxwAwmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxwA3BETkzFARksFAQtjFz76AaA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpIsQAALlnFEUkzFYBPEAAAAAAAABcyRAPBAAFAAcyRTTfPAPAAAhPAkEBBTfPAZBAAOA55A55A85B55A58E55A55AFA3yA42AwBErTfPASksFFGjAAAAAAAAAAAAEAAAcyRAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPAkEBtEA6DAFAAATfPAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFZSI0SA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpJsQAA/k0FNWmvFytFh0FjvFklF94Et1EurFuvF3uFtzAwwA4xBy1AmhEk2F9xA01A51A23A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA50A23AzxA21AmjEpkF9xAz4Ay5Aw0AxzA5zA4mAzpF6lF9zAwwA4xBy1AmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA50A23AzxA21AmhEwkF91Ax5A02A3zAx2A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A5zAymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B02A53Ax1Az4A44AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAx0A45A02A04AmjEpkF9xAz4Ay5A14A1zA25A3mAzpF6lF95A3wA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF91AyxA04A50A20A4mAhwFk9B1yAx0A45A02A04AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A35A50AymEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A54Aw0A5wAy4A0mAjpFk9BxzA4yA2zA21A11A1yAmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B05A4wA05AwyA40AmhEwkF90A54Aw0A5wAy4A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxwAwmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxwA3mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F95AxwAw1A3xAz1AmjEwpFk9BklFzrF0vFwmBhwFh9B1yAyxAxzAy0A52AmjEpkF9xAz4Ay5A23A1yA13A0mAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yAyxAxzAy0A52AmhEwkF91AyyAxxAzyA05A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A32A4zA33A4wAxxA0BETkzFARksFAQtjFwrRGeA
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.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:39 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:40 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.142.194 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-142-194.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Fri, 20 Dec 2019 10:29:40 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
701 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=3723776517
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.8.37 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

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

Response headers

Date
Fri, 20 Dec 2019 10:29:41 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
773DAC923B4B53C1
Content-Length
53
x-amz-id-2
sVdPTx63R8wV0y+XKDZoBQ+iKD7J4Wv9QvjTZuOLgS68EvqmjZlIVjvtOJyfWHXjKY3soHbuICA=
Last-Modified
Fri, 20 Dec 2019 05:35:06 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
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=7488988245
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
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

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

Response headers

Date
Fri, 20 Dec 2019 10:29:40 GMT
Last-Modified
Thu, 14 Nov 2019 17:36:22 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=5037390733
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.125 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-125.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

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

Response headers

Date
Fri, 20 Dec 2019 10:29:40 GMT
Via
1.1 eb83e7e264681d87a86c9b6a2159e502.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
3UwZNMUH1TK7kjGTuBLPnxUECBOR6vXYY-6Tg4o_TRr9mE0Fob-tVA==
Expires
0
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.3, , 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

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
9wmXmJRzbqUN1J_FE3OdLbfoYkoSRNk9
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 21:27:04 GMT
Server
AmazonS3
x-amz-request-id
D94D6A0473C8F236
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 20 Dec 2019 10:29:40 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
qS8dDZ/ynC/Wy3/uoo/gOZBUeRXqNOHA0PXkZiy9m4jayxn9P0nhuAhVo5VMAqpohKre2wji2qo=
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=26349831
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.103 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8

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
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 18:48:03 GMT
server
nginx
etag
W/"5dcafe63-9d2b"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 20 Dec 2019 10:34:40 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1 KB
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: 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
194.213.222.29 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn4.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

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, 20 Dec 2019 10:29:40 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:11:53 GMT
Server
ibillboard
ETag
W/"59d13df9-421"
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Thu, 26 Dec 2019 10:35:34 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
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

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
Fri, 20 Dec 2019 10:29:40 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1687
content-type
text/javascript
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
581 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=52117997&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

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, 20 Dec 2019 10:29:41 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
/
ssl.1.damoh.golem.de/5fc58d3f9573571d07980b4a87d39ee81505b3bf/
311 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/5fc58d3f9573571d07980b4a87d39ee81505b3bf/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.90.4 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.4.90.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab

Request headers

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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 20 Dec 2019 10:29:40 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
de4-homad-5
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
dt
dt.adsafeprotected.com/
43 B
308 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=313194&asId=4ade05b8-c978-060f-6f2d-c3846638c6aa&tv={c:xkRa64,pingTime:-10,time:398,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.114v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC4xMTR2MTIwMHx8MTYwMHx8MXx8MXx8MjR8fDEyMDB8fDB8fDB8fDF8fGxhbmRzY2FwZS1wcmltYXJ5fHwyNHx8NC8zfHw0LzN8fDB8fDE2MDA-,no:MTcuNC4xMTR2TW96aWxsYXx8TmV0c2NhcGV8fG58fDE2fHxufHwwfHxufHxMaW51eCB4ODZfNjR8fEdlY2tvfHwyMDAzMDEwN3x8LTYwfHxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNF81KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzQuMC4zNzI5LjE2OSBTYWZhcmkvNTM3LjM2fHwxfHwxfHxHb29nbGUgSW5jLnx8bg--,asp:1576837780376||691f1b33bae0b89de93b492fc0e05d04||675c74d5f114ba25a49fb0f4cb02f70f||bf4fa2079e152196493b489ee0d6a007||931cdb5c54ee3002b99a6ab4c267e7b3||6796da39f3402ce2cdeda21a3075d230||e30b7fa02fbbaffd4c79ec2e3167701c||0793b8d47476be829d29fd000f3f4ac0||1576000828}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.39.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
amidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Fri, 20 Dec 2019 10:29:40 GMT
X-Server-Name
dt14ami.ami.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
launcher.js
sak.userreport.com/sdm/
64 KB
20 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: nugmw.userreport.com
URL: https://nugmw.userreport.com/rc-ap/0af14780-424b-4b4d-ba38-e4d4ff5b47d0/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
99.84.92.91 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-92-91.muc50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
1bcdc86e2c79c53cd921ea3fd33e2f1852d45b84ba721bf3632a3ba4c9af8669

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

x-amz-version-id
GK7K12NXMkKrWpMXgRIZsnb1lt2DqOti
content-encoding
gzip
last-modified
Tue, 17 Dec 2019 15:13:34 GMT
server
AmazonS3
age
27
date
Fri, 20 Dec 2019 10:29:13 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=7200, s-maxage=60
x-amz-cf-pop
MUC50-C1
x-amz-cf-id
cMfnb1z4GC6HvFHOOHDp6H7VHC-c97HtYFY9bjwXZq2_C6Dxm6g-fg==
via
1.1 eaa1b95207b7e17a6ad05a7c45014762.cloudfront.net (CloudFront)
sodar
pagead2.googlesyndication.com/getconfig/ Frame 9DD1
7 KB
6 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2019121002&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.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
1e0163915ca5ce38c406e46ac54e7db51c14f9b5bf8cafa2bdb5b8d2fad98b3c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

timing-allow-origin
*
date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5110
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/ Frame 9DD1
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019121002.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d1b68c05b19c101d32f1555ab1b493fc450b958011de86f43b4a5aa60028a2a2
Security Headers
Name Value
X-Content-Type-Options nosniff
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

date
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1574183596005933"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5491
x-xss-protection
0
expires
Fri, 20 Dec 2019 10:29:40 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/205/ Frame D38D
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/205/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/205/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
sec-fetch-mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
4595
date
Fri, 20 Dec 2019 09:39:08 GMT
expires
Sat, 19 Dec 2020 09:39:08 GMT
last-modified
Tue, 08 Oct 2019 16:22:56 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
3032
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
dt
dt.adsafeprotected.com/
43 B
308 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=313194&asId=4ade05b8-c978-060f-6f2d-c3846638c6aa&tv={c:xkRa8y,time:551,type:e,im:{pci:{tdr:504}},es:0,sc:1,ha:1,gmnp:0,for:1,b11:1,cnod:1,gm:0,slTimes:{i:551,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1303.10.300.600,am:i,cc:1303.10.300.600,piv:99,obst:0,th:0,reas:,bkn:{piv:[545~75],as:[545~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:22,fm:rLbID11+1111|1112|12|1311|1312|14|15|161|17|18|19|1a*.313194-41130583|1b|1c|1d|1e,idMap:1a*,rend:1,renddet:XIFRAME.qs.dr,rmeas:1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.39.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
amidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Fri, 20 Dec 2019 10:29:40 GMT
X-Server-Name
dt14ami.ami.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
Cookie set map
ih.adscale.de/ Frame CB1E
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.3, , 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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
ng=2#3074625533#26280629#0#d7~1&d10~5&d4~6&d11~3&d8~2&d9~2&d12~1&d1~1&d3~5; uu=e93ee2e9865c446fb32ea3dc5efb8bdf; tu=4#1727903106#48~49cad897de870846ca57a040b84e4077~438010~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
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
Fri, 20 Dec 2019 10:29:40 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:40 GMT
Content-Length
654
Connection
keep-alive
Set-Cookie
tu=4#882105437#48~49cad897de870846ca57a040b84e4077~438010~0~0#101~~438010~438010~1#38~~438010~438010~1#72~~438010~438010~1#42~~438010~438010~1#75~~438010~438010~1#60~~438010~438010~1#108~~438010~438010~1#63~~438010~438010~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
89.163.159.125 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

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
Fri, 20 Dec 2019 10:29:40 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:20c3:f600:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

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
Mon, 21 Oct 2019 21:24:56 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
5144685
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
MUC50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
oObOmjHyX-Lg-NWB3r0hZXyCph9jyI8FIycg25gB6LvNyrE_kh3foQ==
via
1.1 a19127e21dc5a939819061334abff380.cloudfront.net (CloudFront)
gen_204
pagead2.googlesyndication.com/pagead/ Frame 9DD1
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=205&t=2&li=gpt_2019121002&jk=3378926742266280&bg=!ammlaXFY75IsoW_BthoCAAAAQVIAAAALmQFe5N4zniiBpoYIxQom2bjKMRgNnbLUGdPcA-428PyXMnkG0AgnN22CiTpzCBDqLMP5OObKXtWf4uHHK6NnJ1h2Rk8sykN_em5zeCBKHy5WTI-SU0vzJ-nIPkQ4ELGDJMy2em6lQz1UhMyV_GMfx5F1VPzTP0ZIK3irURp-fOQMlFZzyOHBw9JrUieL0U1jqml8rBQXWD2PQhCcFX90wPCuU6ZxesTgt9BoD7tZUpk4c2VDxxxwP0RtQuPoDGYuSvWbB3zCPF4UzTsDOxxUGi1ZzhasZwMKBEPRleWGBDJkC4mu7MgoAJsIPRGcxDB38cCYMRCTmFOPgxX0O05b5WyOe_yMQ6dCV-nxFJYIJbY57hUBoDzmaayIODMWUHT43Cqz05KCwT-pjJETP9NL51tJ-06lKwrKxYrquJ9-eV4O7yaISS5H2X1ZGc2xt0uwraKmYYKM7OPqgmRMRV7y3Ig
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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:40 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
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=-1&screen=1200x1600&mbr=49cad897de870846ca57a040b84e4077&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=864914307311
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
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
7874e54e29ef8fb866ef14aceee8ed0f348c9814e8f7a8f18ff600798212a9d8

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
Fri, 20 Dec 2019 10:29:40 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
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,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.90.4 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.4.90.243.136.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

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
Fri, 20 Dec 2019 10:29:40 GMT
Last-Modified
Wed, 29 May 2019 10:51:09 GMT
Server
openresty/1.15.8.2
ETag
"5cee641d-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 0E01
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e22b31a2461fbeadf23eeefa3260fae7a8b3f017f38645ccfd4c7b34b213170e

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
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.249.185.179 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-249-185-179.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

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, 19 Dec 2019 07:36:33 GMT
Content-Encoding
gzip
Last-Modified
Thu, 19 Dec 2019 07:36:08 GMT
Server
akka-http/10.1.11
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame F88C
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWDJsWsR3BiwkWSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4212865644418220734
42 B
659 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4212865644418220734
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.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
Fri, 20 Dec 2019 10:29:40 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Fri, 20 Dec 2019 10:29:40 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4212865644418220734
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame C6D7
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
52.209.100.206 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-209-100-206.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 20 Dec 2019 10:29:40 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
/
ssl.1.damoh.golem.de/a9fc55b1c2a10a3cc061f60ae9c8c93bebf54fcc/
110 B
670 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/a9fc55b1c2a10a3cc061f60ae9c8c93bebf54fcc/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIHBheWVvRmVlRWV2ZWV4aWU9cGF5ZW9GZWVFZXZlZXhpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5YbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkNjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuSGE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkVuKGwpO2IuRG4obSk7Yi5zbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwud2IubGVuZ3RoKXt2YXIgYj1sLndiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGg7aD1lLk1uKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2hbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2hbIltVVElMU10iXV09bDtmb3Iod2luZG93W2hbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBoIGluIGIpbVtoXT1iW2hdO3IoYyxhKX07aD1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChoLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLm5qfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkliPSJzZXR1cCI7dGhpcy5WYz1bXTt0aGlzLndlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuZG4uYmluZCh0aGlzKSk7dGhpcy5xYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtjbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5xYil0aGlzLnFiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5xYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxyYjpmdW5jdGlvbihiKXt0aGlzLnFiW2JdfHwodGhpcy5xYltiXT0wKTt0aGlzLnFiW2JdKz0xOzU8dGhpcy5xYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuY28oKSwhMCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxkbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5jbihiLmRhdGEpfSxjbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxzZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5DZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuWihiKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihiPT0KYSl7aWYoZS53bChiKSlyZXR1cm47KGE9dGhpcy5HZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWS51cmxzW2JdPWE7dGhpcy5ZLnVybHNbYV09Yjt0aGlzLlkuaG9tYWRVcmxzW2JdPWE7dGhpcy5ZLm9yaWdpbmFsVXJsc1thXT1ifX0sd2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5ZLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5vcmlnaW5hbFVybHMmJnRoaXMuWS5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWS5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxzbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxJZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDt2YXIgYT0wLGQ9IiI7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYKYSsrO3JldHVybiBhfSxZZzpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sUG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSx6ZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLmZsKGEpLGY9MDtmPGQubGVuZ3RoO2YrKyl0aGlzLlBuKGIsZFtmXS5rZXksZFtmXS52YWx1ZSl9LE5rOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxmbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9W10sZD17fSxmPWQ9IiIsbj0wO248Yi5sZW5ndGg7bisrKXt2YXIgYz1iW25dLnNwbGl0KCI6IiksCmQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2Y9Y1sxXS50cmltKCk6Zj0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuTmsoY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmZ9O2EucHVzaChkKX1yZXR1cm4gYX0sR2Y6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sdGg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYi5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOgohMTohMX0sUmU6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1hJiYoZT0hMCk7cmV0dXJuIGV9LFNlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuUmUoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2UoYil9LmJpbmQodGhpcyksMTAwKX0sTmI6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGImJgowPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LEtlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBhfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9Yj4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGYsbixjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LHk9MjU2MjM4MzEwMixrPTI3MTczMzg3OCxsPTMyODUzNzc1MjAscCxtLHUscix0O2I9YiYmInN0cmluZyI9PT0KdHlwZW9mIGI/YjoiIjtwPWIubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWIuY2hhckNvZGVBdChmKTw8MjR8Yi5jaGFyQ29kZUF0KGYrMSk8PDE2fGIuY2hhckNvZGVBdChmKzIpPDw4fGIuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHEucHVzaChmKTsxNCE9cS5sZW5ndGglMTY7KXEucHVzaCgwKTtxLnB1c2gocD4+PjI5KTtxLnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8cS5sZW5ndGg7Yis9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1xW2IrCmZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPXk7dT1rO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQobiw1KSsocCZtfH5wJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKG4sNSkrKHBebV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKHAsMzApLHA9bixuPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChuLDUpKyhwJm18cCZ1fG0mdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChwLDMwKSxwPW4sbj10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQobiw1KSsocF5tXnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9bSxtPWQocCwzMCkscD1uLG49dDtlPWUrbiY0Mjk0OTY3Mjk1O2c9ZytwJjQyOTQ5NjcyOTU7eT15K20mNDI5NDk2NzI5NTsKaz1rK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihhKGUpK2EoZykrYSh5KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LENiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsbixjLGUsZyx5PTA7eTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeSsrKSxmPWIuY2hhckNvZGVBdCh5KyspLG49Yi5jaGFyQ29kZUF0KHkrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBhfSxubTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSx5PSExLGs9ITEsbD0hMTt0cnl7YT1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG0pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5iYz8hMDohMX1jYXRjaCh1KXt9dHJ5e249LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSwKZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHk9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxuKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1mO2IuaXNPcGVyYT1uO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1nO2IuaXNFZGdlPXk7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxDYTpmdW5jdGlvbigpe3ZhciBiPXtGaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwKYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0saWs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LHNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sVmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxJazpmdW5jdGlvbigpe3JldHVybiBiLkZpKCl8fGIuTWkoKXx8Yi5ibSgpfHxiLkRqKCl8fGIuaWsoKXx8Yi5zaigpfHxiLlZqKCl9fTtyZXR1cm4gbnVsbCE9Yi5JaygpfSxCbDpmdW5jdGlvbihiKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50LGQsZj1hLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVwvKSlcLz9ccyooXGQrKS9pKXx8CltdO2lmKC90cmlkZW50L2kudGVzdChmWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09ZlsxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBmWzFdO2Y9ZlsyXT9bZlsxXSxmWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiZmLnNwbGljZSgxLDEsZFsxXSk7cmV0dXJuIGYuam9pbigiIil9LFo6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsaCl7YSYmKGQucXVlcnlLZXlbYV09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxuPWIubGVuZ3RoO2Y8bjsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxhYjpmdW5jdGlvbihiKXtiPXRoaXMuWihiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sUGw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5aKGRvY3VtZW50LnJlZmVycmVyKSxiPWQuaG9zdCxhPWQucGF0aCl9cmV0dXJuIGIrYX0sbGw6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXT0hMDtmb3Iobj0wO248Yi5sZW5ndGg7bisrKWRbYltuXV18fGYucHVzaChiW25dKTtyZXR1cm4gZn0sVm46ZnVuY3Rpb24oYixhKXt2YXIgZD0tMSxmPSIiO3RyeXswPGIuaW5kZXhPZigiJSIpJiYwPGE/KGY9Yi5zcGxpdCgiJSIpLGQ9YS8xMDAqZik6KGQ9Yi5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gobil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sVWc6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpO3ZhciBhPSItLTotLSI7MDw9YiYmKGI9TWF0aC5mbG9vcihiKSxhPU1hdGguZmxvb3IoYi82MCksYT10aGlzLm5pKGEpKyI6Iit0aGlzLm5pKE1hdGguZmxvb3IoYi02MCphKSkpO3JldHVybiBhfSxuaTpmdW5jdGlvbihiKXtyZXR1cm4gMTA+Yj8iMCIrYi50b1N0cmluZygpOmIudG9TdHJpbmcoKX0sd2Y6ZnVuY3Rpb24oYil7dGhpcy5JYj1ifSxSZzpmdW5jdGlvbihiLGEsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkliO3RoaXMucGUoZCk7dHJ5eyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSwKZCkpLGIuZGlzcGF0Y2hFdmVudChmKX1jYXRjaChuKXt0aGlzLlhtPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsYi5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLGI9Yi5jb250ZW50V2luZG93KTpiPXdpbmRvdyx3aW5kb3cuQ3VzdG9tRXZlbnQ9e30sd2luZG93LkN1c3RvbUV2ZW50PWIuQ3VzdG9tRXZlbnQuYmluZCh3aW5kb3cpfX0sR2M6ZnVuY3Rpb24oYixhLGQpe2F8fChhPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLlJnKGQsYSxiKX0sbzpmdW5jdGlvbihiLGEsZCxmLG4sYyxnKXt2YXIgQj1iO2QmJmEmJihhPWsuUmEoYSxkKSk7YSYmKEI9ay5SYShiLGEpKTtmJiYoQj1rLlJhKEIsZikpO24mJihCPWsuUmEoQixuKSk7YyYmKEI9ay5SYShCLGMpKTtnJiYoQj1rLlJhKEIsYykpO2UuR2MoQil9LGZuOmZ1bmN0aW9uKGIpe3ZhciBhPXt9OwppZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2EuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuUGwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBhfSwKV246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmhjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5wZShiKX0scGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5mbihiKTtpZihhKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZShhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChkKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5SYygpO2wudmEoYiwhMCk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSWEoYixmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1sLlJjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTtsLnZhKGYsITApO2Y9bC52YShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLApkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFVkOmZ1bmN0aW9uKGIpe2lmKCFsfHwhbC5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5SYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLnZhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSWEoYil9fSwkZTpmdW5jdGlvbigpe2wmJmwuUz9sLmlzRW5hYmxlZCYmbC5UaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZSgpfS5iaW5kKHRoaXMpLAo1MDApfSxHZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMub2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnlkKGIpOiIifSx5ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkplKGIpO2EmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0scmc6ZnVuY3Rpb24oYixhLGQsZil7ZD0hMTtpZihhLlRlKGIpfHx0aGlzLnNtKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guc2YmJndpbmRvdy5zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmCigwPD1zYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnNmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLlFnKGIpKXJldHVybiB0aGlzLlFnKGIpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1iO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5DYihiKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9CiExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxuLGZ1bmN0aW9uKGIpe2M9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9YS5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy56ayhjLGIpO3JldHVybiBjfSxiYjpmdW5jdGlvbihiLGEsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpbigpO2Vsc2V7ay52YShiLGMpO2M9ay52YShiLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuSWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpOwplbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LENkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgeSBpbiBnKWQrPSImIit5KyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1t5XSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihhLGIsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLApsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxEbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5DZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5WYylmb3IodmFyIGMgaW4gdGhpcy5WYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlZjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5DYihiKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZCl9LHloOmZ1bmN0aW9uKGIsYSxkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD0KYjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQ2IoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmJiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuRG0oZi5BZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sTW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuVmM9Yn0saHA6ZnVuY3Rpb24oYixhLGQsZixjKXt0aGlzLmJiKGIsZCx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZC5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksCmE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEprOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBkPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/YT0hMDooZD1iLnN1YnN0cmluZyhkKzcsYi5pbmRleE9mKCIpIixkKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiKwpkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbG06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGdiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPWJ8fHt9fWMuYmo9YTthLlJhPWZ1bmN0aW9uKGIsYSl7dmFyIGQ9e30sZjtmb3IoZiBpbiBhKWRbZl09YVtmXTtmb3IoZiBpbiBiKWRbZl09YltmXTtyZXR1cm4gZH07YS5ZbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5RbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAwMiIsCnR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5vbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmdwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuZGc9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLmlnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLm1nPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5yaz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07CmEuZ2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Jbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuUG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZwPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuY2w9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTsKYS5wZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkNjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5rZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2EudGs9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLmVkPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5tZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5vZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Euc2s9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIiwKbmFtZToiYWRNZXRhIn07YS51aT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlNtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuRGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuTWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTthLkRnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5jcD17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Fbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRm89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ebz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlJtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmJqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Haz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGlhPWMuR2t8fGlhO25ldyBpYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZGo9YTthLnByb3RvdHlwZT17S2U6ZnVuY3Rpb24oYil7dmFyIGE9CjAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxpYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4Iil9LExsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5OYXx8IngiKSsKKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sd2Q6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLndkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMud2QoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZD1iLmxlbmd0aC0xLGE9IiI7MDw9ZDthKz1iW2QtLV0pO3JldHVybiBhfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLktlKHRoaXMuaWEoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy53ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX0sZ206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0scmg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9CnRoaXMuS2UodGhpcy5MbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLndkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgST1jLmRqfHxJO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5FaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMuRWl8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGhbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuaTpmdW5jdGlvbigpe2QuaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gaH07Yy5OaT1hfSkoYyk7dmFyIEs9Yy5OaXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLkFvfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuU2M9MTAwO3RoaXMuT2I9MDt0aGlzLlRhPTE1MDt0aGlzLlViPTA7dGhpcy5GbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuT2I8PXRoaXMuVGE/KHRoaXMuT2IrKyx0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKTowPnRoaXMuVGEmJih0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuU2MpKX0seG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYj50aGlzLlRhPyEwOiExfSxyZjpmdW5jdGlvbigpe3RoaXMuT2I9MH0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxKbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE46ZnVuY3Rpb24oYSl7dGhpcy5KYVthLmlhKCldPQphO0wmJkwueGgmJkwuYm8oYSl9LFFwOmZ1bmN0aW9uKCl7cmV0dXJuIGUuSWUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmlhKCldPyEwOiExfSxtbTpmdW5jdGlvbihhKXthPWEuU2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT10aGlzLkphW2JdLlNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LGlxOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuSmp8fHQ7KGZ1bmN0aW9uKGMpe2MuTGo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5TYz0xMDt0aGlzLk9iPTA7dGhpcy5UYT01MDt0aGlzLlU9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWE7dGhpcy5IYj0iIjt0aGlzLklnPSExO3RoaXMuSygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsaD10aGlzLlNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1oKWEuY29udGFpbmVySWQ9aC5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSxSbjpmdW5jdGlvbihhKXt0aGlzLlU9YX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VfSxJbjpmdW5jdGlvbihhKXt0aGlzLmNmPWF9LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2Z9LGJmOmZ1bmN0aW9uKCl7fSxQOmZ1bmN0aW9uKCl7dGhpcy5PYjw9dGhpcy5UYSYmKHRoaXMuT2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSx0aGlzLlNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7CmVsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxYZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LGtxOmZ1bmN0aW9uKCl7fSxXOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlpsKCl8fHRoaXMudmsoKTt0aGlzLktkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sClNwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHZrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX0sU2E6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSwkcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthfSxhYTpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFRjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxYZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkhiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGJ9LFRoOmZ1bmN0aW9uKCl7dGhpcy5IYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuSGImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEZlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Manx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm9rPSIzIjt0aGlzLmJkPTA7dGhpcy5KbT0zMDt0aGlzLlliPVtdO3RoaXMua2I9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuYmQ7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5HbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLiRlKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmlhKCldfHwod2luZG93W2IuZ2EoKV1bYS5pYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmlhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmdhKCldW2EuaWEoKV1bZS5oYygpXT93aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmlhKCldW2UuaGMoKV09MX0sam06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsaD1uZXcgSTt3aW5kb3dbaC5nYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXSYmd2luZG93W2guZ2EoKV1bYS5pYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBoPSEwO2EmJihoPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmZtKCk7CmlmKCF0aGlzLmptKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMua2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5rYil7Zm9yKHZhciBoPTA7aDx0aGlzLmtiLmxlbmd0aDtoKyspdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksdGhpcy5yY1t0aGlzLmtiW2hdLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmtiW2hdLmRldGFpbCksYT10aGlzLmtiW2hdLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihoPWUudW5pcXVlKGIpLGE9YSsiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LE5uOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5va30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmJkfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSmw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxHbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Ianx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuU2l8fG5hOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlRpfHxvYTsoZnVuY3Rpb24oYyl7Yy5VaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVWl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLm1sfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMuc2I9ITE7dmFyIGE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2EuYXV0aG9yaXR5JiZhLmF1dGhvcml0eS5pbmRleE9mJiYKMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5oaD0hMCk7dGhpcy5IaD0hMTt0aGlzLlBnKCk7dGhpcy5EZSgpO3RoaXMuYmw9ITF9LFBnOmZ1bmN0aW9uKCl7dGhpcy5zYj0hMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7YXx8KHRoaXMuc2I9ITApO2lmKCJPQkpFQ1QiPT1hLm5vZGVOYW1lfHwiVklERU8iPT1hLm5vZGVOYW1lKWE9YS5wYXJlbnROb2RlO3RoaXMuSGg9YTtpZih0aGlzLmhoKXt0aGlzLkRlKCk7aWYodGhpcy5zYilyZXR1cm47YT10aGlzLnZpZGVvVGFnLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLlQoYSl9LERlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Ipe3ZhciBhPXRoaXMuSGgsYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy5zYj0hMCk7dGhpcy5XKGIpfX0sS2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcykpfSxiZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmCmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuY2YmJigwLHRoaXMuY2YpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LApwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciByYT1jLmxqfHxyYTsoZnVuY3Rpb24oYyl7Yy5raj0Kdi5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJkO3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMubGU9ITE7dGhpcy5uZT0xO3RoaXMuY2Q9W107dGhpcy5CYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLm5lPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuQmI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgaD0wO2g8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7aCsrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbaF0udGFnKXt0aGlzLkJiPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuQmI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuQmI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5CYj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0iYWRQbGF5IGFkQ29tcGxldGUgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIiksaD0wO2g8CmQubGVuZ3RoO2grKylhLm9uKGRbaF0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtoXSYmKHRoaXMubGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtoXSYmdGhpcy5FaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkptJiYhdGhpcy56YSgpJiYodGhpcy5CYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy56YSgpJiYodGhpcy5sYSgpLHRoaXMuZ2V0UGxheWVyKCkuYmw9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5IYjtiJiYoYi5GZCgpLGIueWUoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmNkLmluZGV4T2YoYikmJnRoaXMuY2QucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5wYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmNkLmxlbmd0aD49dGhpcy5uZSYmdGhpcy5nKCkpfSxHbTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGc6ZnVuY3Rpb24oYSl7YT90aGlzLkNlP3RoaXMuQ2UrKzp0aGlzLkNlPTE6dGhpcy5CZT8KdGhpcy5CZSsrOnRoaXMuQmU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuR2YoYi52aWRlb1RhZyk/Yi5zYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmxlfHx0aGlzLmlzUGxheWluZz8odGhpcy5CZT50aGlzLkNlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuUGcoKSxiLkRlKCksYi5zYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLmtqfHxzYTsoZnVuY3Rpb24oYyl7Yy5taj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuRmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPQphLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihoPTA7aDxiLmxlbmd0aDtoKyspYS5wdXNoKGJbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgaD1uZXcgcmEod2luZG93Lmp3cGxheWVyKGFbYl0pKTsKaC5zYnx8dGhpcy5MKGgpfHx0aGlzLm1tKGgpfHwodGhpcy5OKGgpLGg9bmV3IHNhKGgsdGhpcy5HKSxoLksoKSxoLmYoKSl9fXRoaXMuUCgpfX0sTnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sRmw6ZnVuY3Rpb24oKXt2YXIgYT1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQ2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubWp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmRtfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuYWEoKSk6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuVGQoYSl9LmJpbmQodGhpcykpfSxUZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGgpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmRrfHx3YTsoZnVuY3Rpb24oYyl7Yy5jaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuTGM9dGhpcy5CYT10aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5PbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLlBrKCksdGhpcy52YigpKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaWEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5GYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkZhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5GYT9hLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkZhP3R5cGVvZiBhLmltYS5GYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5GYT9hLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkZhP3R5cGVvZiBhLkguRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuamU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuamU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5qZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmplOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEua2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5rZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmtlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS50ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgudGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC50ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApKYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkljKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5MYyl7dmFyIGE9dGhpcy5JYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLkxjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5MYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkxjfSxrbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkljKCksYj10aGlzLmltKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxpbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuaGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmhkPSEwKTtyZXR1cm4gdGhpcy5oZH0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkpjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMucG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0scG46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LFBrOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuSGEmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMua20oKSl7dmFyIGI9dGhpcy5JYygpLGg9dGhpcy5KYygpO2ImJmgmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCksYT10aGlzLkpjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgaD0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YiloPSEwO2h8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGh9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmCmIoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LFFrOmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMuRGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkRjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuRGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuRGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5EYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWsoKX0uYmluZCh0aGlzKSwxMCl9LAp0YjpmdW5jdGlvbigpe3JldHVybiBlLnplPyExOnRoaXMudWF9LERhOmZ1bmN0aW9uKCl7aWYodGhpcy4kbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sJGw6ZnVuY3Rpb24oKXtpZigwPD1lLmFiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkNkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuQmwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnplPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5yZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxZazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLlFvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlFvKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMud24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCkpKX0sd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUm8pe3RoaXMuUm89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ja3x8eGE7KGZ1bmN0aW9uKGMpe2MuZWs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxhLmxlbmd0aDtoKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2hdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkllKGIpKXthPWI7Zm9yKHZhciBoIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShoKSYmKGI9bmV3IHdhKGFbaF0pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5TYyl9fSl9KShjKTsKdmFyIHlhPWMuZWt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhsfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Gaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5hYSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5hYSgpfSwkbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkhiLGg9dGhpcy5pYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5rYyYmKDA8PWguaW5kZXhPZihkKXx8Yi5GZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuamY9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx3YTpmdW5jdGlvbigpe3RoaXMuamYrKztpZigxMDx0aGlzLmpmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTsKdmFyIEJhPWMuRmp8fEJhOyhmdW5jdGlvbihjKXtjLkVqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWUpaWYodGhpcy5KYnx8KHRoaXMuSmI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5KYisrLDE1PHRoaXMuSmIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5FZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMudGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBoPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWg9ITA7aHx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gaH1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgaD1hLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYihoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuc2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5zbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLiRtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPQoxNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDwKYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBoPW5ldyBCYShhW2JdKTtoLmthfHx0aGlzLkwoaCl8fCh0aGlzLk4oaCksKG5ldyBDYShoLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Hanx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50aj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMudGp8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmlqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLllnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuYm49CmEucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1hLndpZHRoO2guc3R5bGUubWluV2lkdGg9YS53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7aC5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5ibil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYil9dGhpcy5UKGgpO3RoaXMuVyhoKTt0aGlzLnVkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMudWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnVkKX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGs6ZnVuY3Rpb24oKXtlLnRoKHRoaXMudWQpO2UuUmUodGhpcy51ZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFhlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5panx8R2E7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaGp8fEhhOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1lLllnKGEsImVsZW1lbnRJRCIpOwppZihlLnRoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlViPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmpqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5yanx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmVqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPQpifSxIbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHdrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixoLGQsZil7dGhpcy5YYT1iO3RoaXMuVGc9dGhpcy54aT0hMTt0aGlzLkZoPWQ7dGhpcy5jaT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYKMD09Yy5zdGF0dXMmJmwmJmwuVWUodGhpcy5YYS51cmwpJiZsLlhjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5IbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChoKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxsLmVhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5lYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuVGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpOwp0aGlzLmpiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5jaT90aGlzLmpiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuamIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy54aXx8KHRoaXMuamIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmpiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZil7bCYmbC5VZSh0aGlzLlhhLnVybCk/bC5YYz9sLmVhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLlVlKHRoaXMuWGEudXJsKSx0aGlzLkZoJiZ0aGlzLkZoKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBMYT0KYy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkVhPXRoaXMuZ2U9ITF9Yy5PaT1hO2EucHJvdG90eXBlPXtMbjpmdW5jdGlvbihiKXt0aGlzLmdlPWJ9LEtuOmZ1bmN0aW9uKGIpe3RoaXMuRWE9Yn0sdW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX12YXIgYT17bHA6IkFkQ2xpY2tUaHJ1IixucDoiQWRFcnJvciIsb3A6IkFkU3RvcHBlZCIscnA6IkFkTGluZWFyQ2hhbmdlIixzcDoiQWRUYWdQYXJzZWQiLHZwOiJBZFZpZGVvQ29tcGxldGUiLHlwOiJBZExvYWRlZCIsenA6IkFkU2tpcHBlZCIsQXA6IkFkU3RhcnRlZCIscHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixxcDoiQWRJbXByZXNzaW9uIixtcDoiQWRDcmVhdGl2ZVZpZXciLHRwOiJBZFZpZGVvTWlkcG9pbnQiLHVwOiJBZFBhdXNlZCIsd3A6IkFkVmlkZW9TdGFydCIseHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJgp3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYT13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKHRoaXMuZ2UsYVtkXSl9LHRuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9aWYodGhpcy5FYSYmdGhpcy5FYS5mZSlmb3IodmFyIGEgaW4gdGhpcy5FYS5mZSl0aGlzLkVhLmZlLmhhc093blByb3BlcnR5KGEpJiZiKHRoaXMuRWEsdGhpcy5FYS5mZVthXSk7dGhpcy5FYSYmdGhpcy5FYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuZ2UmJnRoaXMudW4oKTt0aGlzLkVhJiZ0aGlzLnRuKCl9fX0pKGMpO3ZhciBNYT1jLk9pfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGE9ITE7dGhpcy5hYz0iIjt0aGlzLmpkPQp0aGlzLiRiPXRoaXMubGI9bnVsbDt0aGlzLkxnPXRoaXMud2I9dGhpcy5XZT0hMTt0aGlzLkFhPSIiO3RoaXMuVmU9ITE7dGhpcy5xYT10aGlzLktjPSIiO3RoaXMuUWU9dGhpcy5TPXRoaXMuaXNFbmFibGVkPXRoaXMucGY9ITE7dGhpcy5oYT1bXTt0aGlzLk1lPXRoaXMuUWI9IiI7dGhpcy5jZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLmJlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy55Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5YYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5SYj0iIjt0aGlzLlNiPVtdO3RoaXMuVGI9W107dGhpcy5XYz1bXTt0aGlzLm9jPSIiO3RoaXMuRGI9ITE7dGhpcy5TZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLmpjPSExO3RoaXMuQWc9dGhpcy5ZZD1udWxsO3RoaXMuQ2Y9dGhpcy5oYj10aGlzLktnPXRoaXMuV2Q9CnRoaXMuWGM9dGhpcy5sZD10aGlzLnNjPSExO3RoaXMuWmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMuemQ9MDt0aGlzLmpoPSExO3RoaXMuaWg9MUUzO3RoaXMuemM9ITE7dGhpcy5PYT0xRTM7dGhpcy5kZD0iIn1jLmdqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMuYWMsYWR0YWdtb2RpZmllcjp0aGlzLmxiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy4kYixhZHRhZ3JlZ2V4OnRoaXMuamQsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuV2Usc2lkZWxvYWRzOnRoaXMud2IsZGlzYWJsZXRlc3RzOnRoaXMuTGcsaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5WZSxnbG9iYWxDb25maWc6dGhpcy5LYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuUWUsCnNlcnZlcjp0aGlzLmhhLHN2bUNvbmZpZzp0aGlzLlFiLGhvbWFkQWRwYXRoOnRoaXMuTWUsSE9NQURfVkVSSUZJRUQ6dGhpcy5jZSxIT01BRF9CTE9DS0VEOnRoaXMuYmUsSE9NQURfTk9CTE9DS0VSOnRoaXMueWIsSE9NQURfQURCTE9DS0VSOnRoaXMuWGIsdGVzdEhpZGU6dGhpcy5SYix0ZXN0VGFnczp0aGlzLlNiLHRlc3RUYWdzSlM6dGhpcy5UYix0ZXN0VGFnc1hIUjp0aGlzLldjLHRlc3QzUENvb2tpZTp0aGlzLm9jLHRocm90dGxlOnRoaXMuU2QsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5qYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkFnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuc2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmxkLHVzZVN0cmljdENoZWNrczp0aGlzLlhjLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLldkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuWmEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMudGYsCmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy4kYSx2cGFpZDp0aGlzLmhiLHNraXBBbGxvd2VkOnRoaXMuQ2Ysdm1hcHM6dGhpcy5TZixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuemMsYWRGYWxsYmFja1VSTDp0aGlzLmRkfX0sQ246ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuSGE9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMuYWM9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5sYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLiRiPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMuamQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5XZT0KYi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLndiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuTGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLlZlPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLktjPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuUWU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5oYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlFiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5NZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5jZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmJlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLnliPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuWGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJgoodGhpcy5SYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5TYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlRiPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuV2M9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLm9jPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5TZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5qYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5BZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMuc2M9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5sZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5YYz1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLldkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy5aYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMudGY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYKKHRoaXMuJGE9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5oYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5DZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5TZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLnpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5kZD1iLmFkRmFsbGJhY2tVUkwpfSxYbDpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LHZmOmZ1bmN0aW9uKGIpe3RoaXMuWmFbYl09ITB9LEdsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLlphW2FdJiYxPT10aGlzLlphW2FdJiZiLnB1c2goYSk7cmV0dXJuIGJ9LFFkOmZ1bmN0aW9uKGIpe2I9Ynx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBiO2I9Yi5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7Yj1iLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7Yj1iLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKDEwKS50b1N0cmluZygpKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWUuSmsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWEpcmV0dXJuIG5ldyBBKGIpO2Y9dGhpcy5UZShiKTsKYz10aGlzLlooYik7Zj8odGhpcy5NYygpP2U9YjplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5SYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLmFjfHx0aGlzLmxifHx0aGlzLiRifHx0aGlzLmpkKSYmKGc9dGhpcy5MbShnKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLklsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkNiKGcpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5NYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sTWM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaGEmJnRoaXMuaGEubGVuZ3RoJiYwPHRoaXMuaGEubGVuZ3RoJiYoYT10aGlzLmhhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuVGUoYik7cmV0dXJuIGF9LApJbDpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5IcDtyZXR1cm4ibm9uZSJ9LEFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFbdGhpcy50Zl19LFJjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZCgpLGE9dGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxCaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJgooYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sS206ZnVuY3Rpb24oYixhKXt2YXIgZD1lLlooYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEM9MDtDPGcubGVuZ3RoO0MrKyl7dmFyIGs9Z1tDXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LExtOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5sYilmb3IodmFyIGEgaW4gdGhpcy5sYil0aGlzLmxiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmxiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5LbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sV2s6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUmsodGhpcy55YS5jbGllbnRBUElzKX0sUms6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkxuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5LbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5WZT0hMDt0aGlzLktjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLllkPWY7dGhpcy5FYz1jO3RoaXMueWE9ZXx8e307dGhpcy5XaygpO3RoaXMuQ20oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5BbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQmMoKX1jYXRjaChnKXt0aGlzLmVhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5CYygpfWNhdGNoKGspe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9fSx1YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQ206ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuS2MrdGhpcy5yZSgiZ2xvYmFsIikpLHRoaXMuVmwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5CYygpfS5iaW5kKHRoaXMpLCEwKX0sQW06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMucWErdGhpcy5yZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5CYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5lYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk5iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZWE6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGQpe3RoaXMubGQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGgpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRWM9CiExKTt0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUWU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMuYmUpKTt0aGlzLlZiKCk7ZS5HYyhrLlltKTsoYT1lLmFiKHRoaXMuQWQoKSkpfHwoYT1lLmFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxWbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZj0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZj0hMCl9Y2F0Y2goZyl7fWlmKCEoZnx8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYKYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLmlzRW5hYmxlZD10aGlzLmdiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUWJ8fHRoaXMuQWF8fHRoaXMuQmMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfX0sQmM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT0hMTt0cnl7dmFyIGM9ZS5aKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmCjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGcpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGg7KGg9dm9pZCAwPT09YSl8fChoPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5BZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihoKXJldHVybiExfWNhdGNoKGYpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goQyl7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5GKCJ3ZWIuZGUiKXx8ZS5GKCJnbXgubmV0Iil8fGUuRigiZ214LmF0Iil8fGUuRigiZ214LmNoIil8fGUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLk1jKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLk1lPWQuYWRwYXRofHwiIjt0aGlzLnRmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoKdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlFiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLk5jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnViKHRoaXMueWIpKSx0aGlzLlZiKCkpfSxYaDpmdW5jdGlvbihiKXt0aGlzLmRkfHwodGhpcy5kZD1ifHwiIil9LE5jOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBBKHRoaXMuUmMoKSksZD10aGlzLloodGhpcy5RYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLlFiK3RoaXMucmUoImN1c3RvbWVyIikpO3RoaXMuSWEoYSwKdGhpcy5mby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY3VzdG9tZXIiKTtiP3RoaXMuVWo/dGhpcy5lYSgibm9TVk1Db25maWciKToodGhpcy5Vaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTmMoITApfS5iaW5kKHRoaXMpLCEwKX19LGZvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5OYyghMCk7cmV0dXJufX1hPSExO3RyeXt2YXIgYz1lLloodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihhPSEwKX1jYXRjaChnKXt9aWYoIShhfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKEMpe310aGlzLlhjPXRoaXMuZ2IoZC5zdHJpY3QpO3RoaXMuV2Q9dGhpcy5nYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5nYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlJiPWQudGVzdGhpZGV8fCIiO3RoaXMuVGI9ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5XYz1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMub2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMuYWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5sYj1kLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmpkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLldlPWQuanNwb3B1cHN8fCExO3RoaXMud2I9ZC5zaWRlbG9hZHN8fCExO3RoaXMuaGI9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLmhiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5tZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuU2Q9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5qYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuamM9ITAsdGhpcy5OYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5ybygpJiYodGhpcy5SYnx8dGhpcy5UYnx8dGhpcy5TYnx8dGhpcy5XYyk/dGhpcy5wZj8KKHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLnliKSksdGhpcy52ZSgpLHRoaXMuVmIoKSk6dGhpcy5qbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sam86ZnVuY3Rpb24oKXt0aGlzLmlvKCk7dGhpcy5rbygpfSxrbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9CjE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxnPWUuWCgxMCksQz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihDKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmIoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQ2IoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS50ZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuQ2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZWEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEtmOmZ1bmN0aW9uKCl7dGhpcy5TPQohMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKX0sUmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIoYikpLHRoaXMuVmIoKSx0aGlzLnZlKCkpfSxpbzpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBiPWUudGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLnBtKCkpdGhpcy5SZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5SYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlJiKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTmIoKSksdGhpcy5ubyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUmQodGhpcy5YYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlNiPXRoaXMuV2MpJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9CnRoaXMuU2Iuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxubzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk5iKCkpLHRoaXMub28oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlJkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuVGImJnRoaXMuVGIubGVuZ3RoKXt2YXIgZD0KdGhpcy5UYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LG9vOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YjtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxIZjpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuQ2QodGhpcy5vYywKImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuRGI9IXRoaXMuZ2IoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMudWIodGhpcy55YikpO3RoaXMuVmIoKTt0aGlzLnZlKCl9LHBtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFZiOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLkNhKCkmJihiPSIxIil9Y2F0Y2goZCl7Yj0yfXRoaXMuc2MmJihhPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixiKyIiK2EsITApO3RoaXMub2MmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsCnRoaXMuRGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy51Yih0aGlzLmNlKSk7dGhpcy5ZZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLllkJiZ0aGlzLllkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkRifSl9LFZrOmZ1bmN0aW9uKCl7aWYodGhpcy5XZCYmdGhpcy5YbCgpKXt2YXIgYj10aGlzLkdsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCl9LElhOmZ1bmN0aW9uKGIsYSxkLGYsYyxnKXt0aGlzLnpkfHwodGhpcy56ZD0wKTt0aGlzLnpkKys7dGhpcy56ZD50aGlzLmloJiYhdGhpcy5qaCYmKHRoaXMuamg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50IiwKdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5ubSgpJiYoYi5UZz0hMCk7ZyYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sU2s6ZnVuY3Rpb24oKXtlLkNhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYlswXSYmKGI9YlswXSksYil7Zj1iJiYKYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLk1jKCl8fChiPXRoaXMuWihmKSxmPWIucHJvdG9jb2wrIjovLyIrYi5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZWEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LApobzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5TZn0sVGs6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYj10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjtiLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGIsdGhpcy5Iby5iaW5kKHRoaXMpLHRoaXMuR28uYmluZCh0aGlzKSl9LEhvOmZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXtyZXR1cm59ZHx8CnRoaXMucWwoKX0sR286ZnVuY3Rpb24oKXt9LHFsOmZ1bmN0aW9uKCl7ZS5HYyhrLnBsKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmVhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx2ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMud2IubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy53YltiXTsicmVxdWVzdCI9PWEudHlwZSYmZS5iYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWEudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztlLmJiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbihiKXtpZihiLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHJvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuU2R9LE5iOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLApifHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9Ynx8MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifSxDYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxjLGUsZyxrLGwsbT0wO208Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KG0rKyksYz1iLmNoYXJDb2RlQXQobSsrKSxlPWIuY2hhckNvZGVBdChtKyspLGc9ZD4+MixkPShkJjMpPDw0fGM+PjQsaz0oYyYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oYyk/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYX0sWjpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFthW2NdXT1iW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxoKXthJiYoZC5xdWVyeUtleVthXT1oKX0pO3JldHVybiBkfSxBZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBkPSIiLGMsaDtmb3IoYz03OzA8PWM7Yy0tKWg9Yj4+PjQqYyYxNSxkKz1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxnPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxxLHUsdix3O3A9Yi5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPHAtMztjKz00KWU9Yi5jaGFyQ29kZUF0KGMpPDwyNHxiLmNoYXJDb2RlQXQoYysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrMik8PDh8Yi5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWIuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWIuY2hhckNvZGVBdChwLTIpPDwyNHxiLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9Yi5jaGFyQ29kZUF0KHAtMyk8PDI0fGIuY2hhckNvZGVBdChwLTIpPDwxNnxiLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYj0wO2I8eC5sZW5ndGg7Yis9MTYpe2ZvcihjPTA7MTY+YztjKyspZ1tjXT14W2IrY107Zm9yKGM9MTY7Nzk+PWM7YysrKWdbY109ZChnW2MtM11eZ1tjLThdXmdbYy0xNF1eZ1tjLTE2XSwxKTtlPWs7cD1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8fnAmdSkrditnW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKHBecV51KSt2K2dbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKHAsMzApLHA9ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhwJnF8cCZ1fHEmdSkrditnW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChwLDMwKSxwPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsocF5xXnUpK3YrZ1tjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGEoaykrYShsKSthKG0pK2EocikrYSh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLGw9bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLlVtfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmViPWEuYy5SKCk6dGhpcy5lYj0iIjthLmMucWgmJmEuYy5xaCh7cGF1c2U6dGhpcy5GZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlZoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmRmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuem8uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5uYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmZjPXRoaXMua2Q9ITE7dGhpcy5Iaz0xRTM7dGhpcy5zYT1udWxsO3RoaXMuQT1jO3RoaXMuaWI9e307dGhpcy52aWRlbz17fTt0aGlzLk9kPXt9O2UucmIoIm5ld0JpZ0FkSWQiKTt0aGlzLktrPWUuWCgxMCk7CnRoaXMuRWY9MDt0aGlzLmdkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZ2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ2s9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5RYz10aGlzLk5kPSExO3RoaXMuemg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLnFlPSExO3RoaXMubWk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5rYz0hMTt0aGlzLmRsPWUuWCgxMCk7dGhpcy5NYj1lLlgoMTApO3RoaXMuS2I9ZS5YKDEwKTt0aGlzLlpoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWmQ9CnRoaXMuV2I9dGhpcy54ZT10aGlzLnFkPXRoaXMuUGQ9dGhpcy54Yj10aGlzLnFjPXRoaXMuSWg9dGhpcy52ZD10aGlzLnNvPXRoaXMuQWI9dGhpcy5MYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5WbT0yMDA7dGhpcy5WZj10aGlzLlljPXRoaXMuQWM9dGhpcy5VZj10aGlzLm9mPSExO3RoaXMuZmY9e319Yy5haj1hO2EucHJvdG90eXBlPXtCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBjfSxraTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5JYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuWW4oKTtlLm8oay50ayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxaZTpmdW5jdGlvbihhLGMsZCxmKXt0aGlzLkFiPQpkO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkEuUyl0aGlzLkVmKyssZS5yYigibmV3U21hbGxBZElkIiksdGhpcy5BLlZrKCksZj1sLmdldENvbmZpZygpLGUuemUmJih0aGlzLkEuQ24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5IYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5raSgpLG5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpjLGJpdHJhdGU6Zi5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpjPyh0aGlzLmtpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnpoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmhiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBxYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtxYy5aZShhLGMsZCl9LDUwKX19LGtmOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5aZD10aGlzLldiPXRoaXMudmQ9ITE7dGhpcy5iPWE7dGhpcy5Tbih0aGlzLmIpO3RoaXMuZWgoYSk7dGhpcy52Yz10aGlzLlZnKGEpO3RoaXMuWmsoKX0sZWg6ZnVuY3Rpb24oYil7YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksYi5wYXJlbnQmJmIucGFyZW50IGluc3RhbmNlb2YKYSYmKHRoaXMuT2Q9dGhpcy5SbChiKSksdGhpcy5laChiLnBhcmVudCkpfSxWZzpmdW5jdGlvbihiKXt2YXIgYz1bXTtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSwhYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChjPXRoaXMuVmcoYi5wYXJlbnQpKSxjLnB1c2godGhpcy5BbChiKSkpO3JldHVybiBjfSxBbDpmdW5jdGlvbihhKXt2YXIgYz0iIixkPVtdO2lmKGEmJmEuSiYmYS5KLmdldEF0dHJpYnV0ZSl7Yz1hLkouZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZD1bXSxmPVtdLGU9W10sZz0iIjtpZihhLkope2M9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7CmY9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuSi5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLkouZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWQucHVzaChhLm9iKGNba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LHJhOmZ1bmN0aW9uKGEpe2EuWWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYz0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmCihjPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuc2QmJmEuc2QuZXJyb3ImJmEuc2QuZXJyb3IuY29kZSYmKGM9YS5zZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LiRjLmNvZGU6Yz09Ri5oZS5jb2RlP2UubyhrLmVwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk6KGUuJGUoKSxjPT1GLlpmLmNvZGUmJmUubyhrLlBtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpO2UubyhrLm9sLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5abigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRGIsITApO2JyZWFrO2Nhc2Ugdy5YZi5jb2RlOmUubyhrLklvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuJGYuY29kZTplLm8oay5mcCwKdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHcuaWUuY29kZTplLm8oay5ncCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuUW0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LmFlLmNvZGU6ZS5vKGsuRW8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LldmLmNvZGU6ZS5vKGsuRm8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuZ2MoYSk7dGhpcy5QYSgpfSxnYzpmdW5jdGlvbihhKXt2YXIgYz0KOTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGM9YS5lcnJvci5jb2RlLDkwMTxjJiYoYz05MDApKTtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLk1hLmxlbmd0aDspdHJ5e3ZhciBkPWEuTWEucG9wKCk7dGhpcy5ZZShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZil7fX0sU246ZnVuY3Rpb24oYSl7dGhpcy54ZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgYz05OTk5O3RoaXMuY29uZi56SW5kZXgmJihjPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9YztjPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxmPSIiO2QmJmQuZW52dmFycyYmKGY9ZC5lbnZ2YXJzKCkpO2YudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQueGQmJihmPWQueGQoKSk7Zi52aWRlb1Nsb3QmJihjPWYudmlkZW9TbG90LHRoaXMub2Y9CiEwKX1jYXRjaChnKXt9Yy5ocT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYy5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGMuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmMuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuQ2smJnRoaXMucGxheWVyLkZlKCkmJihjLnZvbHVtZT10aGlzLnBsYXllci5GZSgpLzEwMCk7Zm9yKDtjLmZpcnN0Q2hpbGQ7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJgp0aGlzLnhrKGMsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5vZiYmYy5sb2FkKCk7aWYodGhpcy5naShjKSl7dGhpcy4kaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy5BayhjKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMub2Y/dGhpcy52aWRlbz1jOnRoaXMudmlkZW89dGhpcy5zYS5hcHBlbmRDaGlsZChjKX1jYXRjaChsKXt0aGlzLnZpZGVvPWN9fWVsc2UgdGhpcy5iLiRrKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnNhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpLHRoaXMuUW4oKSk6dGhpcy5iLm9yaWdpbi5NZyh3LmVlKX0sUW46ZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMueGI9dGhpcy5xYz0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54Yj0hMCk7ZS53ZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5uYSYmZS5Cayh0aGlzLmIub3JpZ2luLm5hKTt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLkpoKCk7dGhpcy5hLkJmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7CmEucGFyZW50fHx0aGlzLmEuQmYoKTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuemYodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnNhPXRoaXMuYS5JO3RoaXMucmkoInZwYWlkIik7aWYodGhpcy54Yil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlBiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5EZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfXRoaXMuQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSS5hcHBlbmRDaGlsZCh0aGlzLkMpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS56Zih0aGlzLkMsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMudGEmJnRoaXMuYS5jLnRhKCkmJihhPSEwKTt2YXIgYj10aGlzLmIuVWwoKSxjPXRoaXMuYi51Lk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8Yi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsCmNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmphKHRoaXMuQywiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIiwKZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUucmcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkEpO3RoaXMuQy5zcmM9YTtlLnNlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmEuYy53YSYmIXRoaXMuUGQmJnRoaXMuYS5jLndhKCkmJmUubyhrLkNjLHRoaXMuYS5jLmwoKSwKdGhpcy52KCksdGhpcy5zKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5pYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy52Yz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVG8oKSx0aGlzLmEuaWMoITApLCF0aGlzLldiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLldiPXtlbDp0aGlzLkMsY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPQohMDtlLm8oay51aSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5TZSh0aGlzLldiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWG8oKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmljKCEwKSx0aGlzLmFwKCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlpvKCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYnAoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMudmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDsKZ3x8KGc9dGhpcy5iLmVjKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UubyhrLkNnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuQS56Y3x8dGhpcy5ZYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS5vKGsub2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmCih0aGlzLlljJiYodGhpcy5WZj0hMSx0aGlzLm5jKCkpLHRoaXMuVm8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy54Yj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLnhiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5QYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5NZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxlLm8oay5vZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX19LmJpbmQodGhpcykpOwplLnNlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO2Uuc2UoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEub2coZnVuY3Rpb24oYSl7ZS5qYSh0aGlzLkMsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMudHJhY2soInBhdXNlIik7ZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMucWM9ITB9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSk7dGhpcy5xYz0hMX0sWG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLm8oay5sZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5rZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLmFpKCk7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuVmEoInN0YXJ0Iik7ZS5vKGsuZWQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sWm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy52ZD0hMDt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSl9LCRvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2UubyhrLmlnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LGJwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxZbzpmdW5jdGlvbigpe3RoaXMuUGYoKTt0aGlzLlZhKCJjb21wbGV0ZSIpfSx2aTpmdW5jdGlvbihhKXtpZih0aGlzLkMmJnRoaXMuQy5wYXJlbnROb2RlJiZ0aGlzLkMucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlVhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYz10aGlzLkMucGFyZW50Tm9kZTt0aGlzLkMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkMpO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKTtlLndlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSwKU286ZnVuY3Rpb24oYSl7dmFyIGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZzshYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYy5tYXRjaChkKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpO2UubyhrLmNwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy52aSghMCl9LHhrOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi5NYygpKXt2YXIgYz1iLlooYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkEpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkEpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5MYiYmIXRoaXMuZmMpe3RoaXMua2Q9ITA7dHJ5e2lmKCFlLkNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkxifHwodGhpcy5MYj0hMCx0aGlzLkpkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkEuS2d8fAp0aGlzLkEuZWEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMucWR8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5xZHx8KGE/dGhpcy5QYSgpOih0aGlzLmRmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLnFlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkhlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5BLiRhJiYhdGhpcy5MYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5QYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy5zKCkpO2UuV24oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLiRkJiZ0aGlzLnVrKHRoaXMuYi4kZCk7aWYoIXRoaXMueGUpaWYodGhpcy54ZT0KITAsdGhpcy5aZHx8KGUubyhrLlNtLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnpifHx0aGlzLmIudGMpe2UucmIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMua2Q9ITE7dHJ5e3RoaXMuSmQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5pYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLk5kPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChnKXt9dGhpcy5QZD0hMDt0aGlzLmEuTGUoKTt0aGlzLmtjPSExO3RoaXMuSGUoKS5UaCgpO3RoaXMuYi56YiYmdGhpcy5iLm9yaWdpbi5lZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueWUoKSl9ZWxzZSB0aGlzLnllKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQS5TaygpO3RoaXMuYi5vcmlnaW4uTWcody5lZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy5zbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5QZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQ2MsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudm8oYSk7aWYoIXRoaXMuV2Ipe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuV2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlNlKHRoaXMuV2IpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTmR8fCh0aGlzLk5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnpiPyh0aGlzLmZjPXRoaXMua2Q9ITEsdGhpcy5KZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLk5kPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZWYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5nZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5xZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy52ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHZvOmZ1bmN0aW9uKGEpe2UubyhrLm9lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5MYnx8KDA9PWEmJih0aGlzLkFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLkFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5BLkRiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5EYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLkxifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5BLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy52ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5BLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkEuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWW46ZnVuY3Rpb24oKXtlLlVkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5VZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxabjpmdW5jdGlvbigpe2UuVWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlVkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5BLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LFBiOmZ1bmN0aW9uKGEsYyl7dGhpcy5BLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuTGIpe3RoaXMuZmYmJnRoaXMuZmYudHJhY2smJnRoaXMuZmYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnplJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlNsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZz0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLkFjPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuT2QuaW1wcmVzc2lvbnMmJmUubG0oZy51cmwsdGhpcy5PZC5pbXByZXNzaW9ucyk/dGhpcy5ZZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuT2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlllKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5rbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5DYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLlljJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFllOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQS52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5BLklhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGFvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFNsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0sa2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLkNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLnpjfHx0aGlzLlljKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmdkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5tZCYmKGM9dGhpcy5BLm1kKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkZiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRmI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sTGQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5tZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuTGQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkdiKCk7dGhpcy5GYigpfS5iaW5kKHRoaXMpKTsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLktiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy51by5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvLmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkxkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5HYigpO3RoaXMuRmIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5MZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuR2IoKTt0aGlzLkZiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5kZigpKTt0aGlzLkdiKCl9fSxHYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpKX0saWk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKTt0aGlzLnFjPyhlLmphKHRoaXMuQywiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMucWM9ITEpOihlLmphKHRoaXMuQywiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuR2IoKSx0aGlzLkZiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5xYz0hMCl9LEZkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsubWUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5NYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5lZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sdG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuUGIoIm11dGVkIiwidXNlciIpLGUubyhrLkRkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx1bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpOwp0aGlzLnhiPyhlLmphKHRoaXMuQywiY29udHJvbCIsInVubXV0ZSIpLHRoaXMueGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMueGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5QYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuRGQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHpvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlBiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxtYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm1jKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYyk7dGhpcy5xZHx8dGhpcy5xZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmYoKSl9LHllOmZ1bmN0aW9uKCl7dGhpcy51bSgpJiZ0aGlzLnRtKCkmJih0aGlzLkEuc2N8fCJzcGllZ2VsLmRlIj09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5hYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuSWImJnRoaXMud28oKXx8KHRoaXMucWQ9ITAsdGhpcy5BYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5BYj0hMSksdGhpcy5FZygpKX0sdW06ZnVuY3Rpb24oKXt2YXIgYT1lLnRkKCk7aWYoIXRoaXMuQS5oYnx8ZS5DYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGM9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuQ2EoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsYytkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHRtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5RY3x8KGE9CiEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTsoYXx8IXRoaXMuQWMmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlFjfHxlLnRyYWNrKCJzdGF0c193dF9hbGxvd2VkIiwodGhpcy5BYz8iYW55IjoiIikrKGMuYWRGYWxsYmFja1VSTD8iIjoibm9mYiIpKyh0aGlzLlFjPyJvbmx5IjoiIiksITApO3JldHVybihhfHwhdGhpcy5BYyYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUWN9LEhsOmZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS5aKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9Yy5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LHdvOmZ1bmN0aW9uKCl7bC5nZXRDb25maWcoKTt0aGlzLlFjPXRoaXMuWWM9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsCnRoaXMuV2EoKSwhMCk7dGhpcy5BYz0hMDt2YXIgYT10aGlzLkhsKCksYT1lLnJnKGEsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoIWEpcmV0dXJuITE7dGhpcy5aZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO3JldHVybiEwfSxFZzpmdW5jdGlvbihhKXt0aGlzLmFvKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5FZyghMCl9LmJpbmQodGhpcyksdGhpcy5WbSk6KHRoaXMuUGQ9ITAsdGhpcy5hLkxlKCksdGhpcy5hLnluKCksdGhpcy5rYz0hMSxlLm8oay5jbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMuSGUoKS5UaCgpKX0sSGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sc2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5SZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkZkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5iLmVjLGEuZHVyYXRpb249dGhpcy5iLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5iLnpiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMudmMmJjA8dGhpcy52Yy5sZW5ndGgmJihhLmFkSWRzPXRoaXMudmMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sczpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuS2srIi0iK3RoaXMuRWY7dGhpcy5iJiZ0aGlzLmIuJGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuRGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYT1jLkRpfHxRYTtuZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm1hPW51bGw7dGhpcy5WPVtdO3RoaXMuSj1udWxsO3RoaXMudWM9dGhpcy53Yz0hMTt0aGlzLm5hPSIiO3RoaXMuVGY9ITE7dGhpcy5saD0iIjtkJiZkLmVtcHR5P3RoaXMuRm0oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxoLGQ9W107Yy5iaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50ZCgpLGI7Yj1lLlooZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9CiIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLnZhKGwuUWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5DYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxoKCkpe3ZhciBnPWUuR2codGhpcy51cmwpO2d8fChnPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaD1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGcuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWcuaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGcuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxoKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlFkKGcpKSsiJnR5cGU9anMiLGI9bC52YShsLlFkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuUWQoZyksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5FbS5iaW5kKHRoaXMpLHRoaXMuQm0uYmluZCh0aGlzKSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSWIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLklifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5JYnx8dGhpcy5ybShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5obygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEVtOmZ1bmN0aW9uKGEpe3RoaXMuZ24oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMubGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLlBjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUWEody4kYyx7ZXJyb3I6dGhpcy5UZj8KRi5oZTpGLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuYWIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxGbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlFhKHcuaWUpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5QYygpOnRoaXMucmEodGhpcy5RYSh3LiRjLHtlcnJvcjp0aGlzLlRmP0YuaGU6Ri5ZZn0pKX0sQm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUWEody5YZix7ZGVwdGg6Yn0pKX0sUGM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy52bSgpP3RoaXMucG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5maCgpLGgse0FkU3lzdGVtOnRoaXMuemwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5RYSh3LiRmKSk6KGI9MCx0aGlzLkNvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGVmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5QYygpKTp0aGlzLnBhcmVudC5lZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuUGMoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQ286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tbygpP3RoaXMubG8oKT8hMDooLTEhPXRoaXMuSGMoKT90aGlzLnJhKHRoaXMuUWEody5hZSkpOnRoaXMucmEodGhpcy5RYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUWEody4kYyxGLlpmKSksITEpfSxrZjpmdW5jdGlvbihhKXt0aGlzLm5hfHwodGhpcy5uYT0iIik7YS4kZHx8KGEuJGQ9W10pO2EuJGQucHVzaCh0aGlzLmxoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuYWYoKSk7YS56Yj1hLnpiP2EuemI6dGhpcy53YzsKYS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuSGMoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5DbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy55bCgpO2EuRGY9dGhpcy5RbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7aWYoIXRoaXMuSiYmdGhpcy5tYSYmdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj0KdGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLk1hPWEuZXJyb3IuY29kZSE9dy5hZS5jb2RlP2EuTWEuY29uY2F0KHRoaXMuRGwoKSk6YS5NYS5jb25jYXQodGhpcy5NbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLlBjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sZ2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZ2MoYSl9LE1nOmZ1bmN0aW9uKGEsCmIpe3RoaXMucmEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxwbzpmdW5jdGlvbigpe3JldHVybiBiPGh9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkhjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJiF0aGlzLkpmKCkmJihhPSEwKTtyZXR1cm4gYX0sZ246ZnVuY3Rpb24oYSl7dGhpcy5uYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm5hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubmE9CiJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2UodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0semw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HZSh0aGlzLkosIkFkU3lzdGVtIil9LGFmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuc2goYSkpe3ZhciBjPQphLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLm9iKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxNbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxEbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYWYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sYmg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPAphLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLm9iKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk9hfHwxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksCmI9aC5jb25jYXQoZSl9Y2F0Y2goZyl7fXJldHVybiBifSx5bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxoPSIiLGU9W10sZz0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2g9Yj10aGlzLnlkKGFbZ10pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxIYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLm9iKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKgorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFFsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChoKXtiPSExfXJldHVybiBifSxHZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMub2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxvYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnlkKGEpOiIifSx5ZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkplKGEpO2ImJihiPWIudHJpbSgpKTsKIWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5jbXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5NYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnpiPSExO3RoaXMuTmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk9lPSIifWMuSWo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sS2w6ZnVuY3Rpb24oKXtpZighdGhpcy5OZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5OZT1hW2RdKX1yZXR1cm4gdGhpcy5OZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk9lKXJldHVybiB0aGlzLk9lO3ZhciBhPSIiOyhhPXRoaXMuS2woKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk9lPWF9LFVsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Janx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Ea3x8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtpZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLExhOiJEVVJBVElPTl9FUlJPUiJ9LCRjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixMYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTGE6IkxPQURfRVJST1IifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTGE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxGPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixMYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGhlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLExhOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLk1qfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnNkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlJpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLmlsfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5YZD1bXTt0aGlzLlJoPVtdO3RoaXMuZ2Y9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy52bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5tbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuWGQucHVzaCh7c3JjOmQsZnJhbWU6ZyxXbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5nZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmdmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5FbChhKSl9fSwKRWw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApUbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuWGQubGVuZ3RoO2MrKylpZih0aGlzLlhkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuWGRbY10uV207cmV0dXJuIiJ9LHZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5UbChjKSx2ZW5kb3I6Y30pO3RoaXMuWG4oKX0sbW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmdmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFhuOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5vbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5vbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLnhtfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLm5iPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTmE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLlBpPWE7YS5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtnPXt4OmUseTpjfTtnLnBvc2l0aW9uPWQ7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMueGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsZz10aGlzLmFtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxlbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkNjLHRoaXMuYy5sKCkpfSx5bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5wZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLm5iLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5uYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLm5iLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMubmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5uYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5uYik7CnRoaXMuYy5UYyYmdGhpcy5jLlRjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHZsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmwodGhpcy5uYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuTGUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5UYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxMZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLlBpfHxZYSxEPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5lbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuZW18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuS2QoYSk7dGhpcy5IZygpfSxLZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5TYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQmp8fGFiOyhmdW5jdGlvbihjKXtjLkFqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnRsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuSGI7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm5kKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubmQoKTtpZighdGhpcy5MZiYmIXRoaXMubmQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19LG5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubmQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxIYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuSGMoKTotMX0sTmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sdGw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG9kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuUGUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ObChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLkFqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Daj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LHFtOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk5qLnBrLm5rP3dpbmRvdy5PTy5Oai5way5uay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucW0oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5JZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy5Pb3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuS2l8fGZiOyhmdW5jdGlvbihjKXtjLkppPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkppfHxnYjsoZnVuY3Rpb24oYyl7Yy5MaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5LZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy51bHx8KHRoaXMudWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkxpfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLk9rfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Yaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxUYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuWGp8fFQ7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5mZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmZkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuVG0oYSl9LmJpbmQodGhpcykpO3guZmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5mZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guV2woKX0sVG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLldqfHxVOyhmdW5jdGlvbihjKXtjLllqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkVkJiYoYT1lLmxsKGEsdGhpcy5FZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkVkfHwodGhpcy5FZD1bXSksdGhpcy5FZC5wdXNoKGFbYl0pLGQ9bmV3IFQoZyksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0scW86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5PY3x8Cih0aGlzLk9jPVtdKSx0aGlzLk9jLnB1c2goYSksdGhpcy54bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxXbDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuT2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5xbyhhKX19KX0pKGMpO3ZhciBqYj1jLllqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMubmx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkdpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5HaXx8bGI7KGZ1bmN0aW9uKGMpe2MuSGk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuSGl8fAptYjsoZnVuY3Rpb24oYyl7Yy5JaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IG1iKGcsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSmFbYS5pYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLklpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk1tPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5NbXx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkZjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkZjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGc9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChnKT09Zz8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsZywhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMueGQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmxuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGQ6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKXJldHVybiB0aGlzLkZjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5GYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGxuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucmVzdW1lJiZ0aGlzLmZhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueWp8fHFiOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5TYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnhkKCk/dGhpcy5EKCk6KHRoaXMuQWV8fCh0aGlzLkFlPTEpLHRoaXMuQWUrKywxMDA8dGhpcy5BZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMueGp8fHJiOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnpqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLlptfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5naz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5na3x8dWI7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5mYnx8KHRoaXMuZmI9W10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuam4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5KYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5mYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5mYltiXSYmMzAzIT10aGlzLmZiW2JdJiY0MDMhPXRoaXMuZmJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5ma3x8dmI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmhrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5RaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5hbigpfS5iaW5kKHRoaXMpLDUwMCl9LGFuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5JbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5JbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuJG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnJsfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuU2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuRWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkViKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sRWI6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5hZC5FYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5TYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuRWIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLmFkPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuYWQuRWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlVrKGFbYl0pO3RoaXMuUCgpfX0pO2MuYWQuRWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuYWR8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5Fa3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mudmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5hYSgpfWVsc2UgdGhpcy5hYSgpfSxXcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuYWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYKKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxUYzpmdW5jdGlvbigpe3JldHVybiEwfSxTYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOgphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBXPWMudmp8fFc7KGZ1bmN0aW9uKGMpe2MudWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWY9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5tZj1hLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLm1mJiZjIT10aGlzLm1mfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuZXEpLHRoaXMuRCgpLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy51anx8WDsoZnVuY3Rpb24oYyl7Yy53aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksCmM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYltkXSkpYT1uZXcgVyhhKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmthP3RoaXMucmYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEcsSmI9Yy53anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLmpsfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaT0KcS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT9hLkdldFZpZGVvRWw/YS5HZXRFbD8oYj1hLkdldFZpZGVvRWwoKSxjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLmFhKCkpOnRoaXMuYWEoKTp0aGlzLmFhKCk6dGhpcy5hYSgpfSxBbjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWml8fE1iOyhmdW5jdGlvbihjKXtjLllpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLllpfHxOYjsoZnVuY3Rpb24oYyl7Yy4kaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLiRpfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Qb3x8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLmFhKCl9LFZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxrbjpmdW5jdGlvbigpe3RoaXMuWmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09CmEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWmN8fCh0aGlzLlpjPSEwLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5WZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuWmMmJih0aGlzLlZkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuWmM9ITEpLHRoaXMuVmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sd2E6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBSYj1jLmtrfHxSYjsoZnVuY3Rpb24oYyl7Yy5qaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpOgp3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFoLmJpbmQodGhpcyksMTApfSxkYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucWs9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5nKCkpOih0aGlzLnFrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5nKCkpfSxjZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2cuYmluZCh0aGlzKSwKMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuUWgoKTt0aGlzLmNnKCk7dGhpcy5ubigpfSxubjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaG4/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuaG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5kYyhhKSl9fSl9KShjKTt2YXIgU2I9Yy5qa3x8U2I7KGZ1bmN0aW9uKGMpe2MubGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEua24oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBUYj1jLmxrfHxUYixVYj1uZXcgVGIoZmEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFZiPWMueG98fFZiO25ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLiRqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuS2g9ITE7CnZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTm09YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9ZWxzZSB0aGlzLmFhKCl9LEFuOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLAowPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ObX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5UZChhKX0uYmluZCh0aGlzKSl9LFRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7CnZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5LaCYmKHRoaXMuS2g9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLiRqfHxOOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5FZSlpZih0aGlzLkpifHwodGhpcy5KYj0wKSx0aGlzLkpiKyssMTU8dGhpcy5KYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5ObigpOnRoaXMuZyghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5nKCk6dGhpcy5nKCEwKX1lbHNlIGlmKGE9CmEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkVlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLnRiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8Ci0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5aanx8TzsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLAphLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnJmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgV2I9Yy5ha3x8V2IsWGI9bmV3IFdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFliPWMud218fFliO25ldyBZYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnBqPQpxLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBZPWMucGp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubWg9MDt0aGlzLk89dGhpcy5PfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5MYz10aGlzLkJhPQp0aGlzLmhkPSExO3RoaXMuT2g9ZS5OYigxMCk7dGhpcy51aCgpfSx1aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5vYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMudmIoKSwhMDt0aGlzLm1oKys7aWYoMTA8dGhpcy5taCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5nKCEwKTp0aGlzLmcoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVoLmJpbmQodGhpcyksMTAwKSwhMX0sdmI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9hO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk89YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJgphW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGIoKT8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5EKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBaPWMub2p8fFo7KGZ1bmN0aW9uKGMpe2MucWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBZKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFpiPWMucWp8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYz1jLkJvfHwKYWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuYWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5XaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVmk9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLnhnKCl9LHhnOmZ1bmN0aW9uKGEpe3dpbmRvdy5HQU5fVmlkZW98fChhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54ZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgY2M9Yy5WaXx8Y2M7KGZ1bmN0aW9uKGMpe2MuWGk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmthKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7CnRoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTt2YXIgZGM9Yy5YaXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGZjPWMuRmt8fGZjO25ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnppPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5hYSgpKTp0aGlzLmFhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSwKUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy56aXx8Z2M7KGZ1bmN0aW9uKGMpe2MueWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSk7dGhpcy51ZSgpO3RoaXMudGcoKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09CnR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sRGE6ZnVuY3Rpb24oKXt0aGlzLnVhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSwKdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmCigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5wYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy51ZS5iaW5kKHRoaXMpLDEwMCl9LHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuemEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fAphLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMueWl8fGhjOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT1uZXcgZ2MoYSk7YS5rYT90aGlzLlAoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBoYyhhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5SYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUmEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMuQWl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLnlvfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLnhoPXRoaXMud2g9ITE7dGhpcy5HZD1bXTt0aGlzLnFmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBTP251bGw6UyxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsClJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWI/bnVsbDpVYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIEphP251bGw6SmEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLApBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Laj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLk9sKGEpOltdLGM7dGhpcy54aD0hMDtpZihhLmxlbmd0aCl7dGhpcy53aD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sdGhpcy5XaChjKX1lbHNlIGZvcihkIGluIHRoaXMucWYpe2lmKHRoaXMudmgpYnJlYWs7Yz10aGlzLnFmW2RdO3RoaXMuT2YoYykmJih0aGlzLkdkLnB1c2goYyksdGhpcy5XaChjKSl9fSxPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYztmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkPWFbZV0sZD10aGlzLnFmW2RdLHRoaXMuT2YoZCkmJmMucHVzaChkKTsKcmV0dXJuIGN9LFdoOmZ1bmN0aW9uKGEpe3RoaXMuT2YoYSkmJmEuZigpfSxibzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMud2gpZm9yKHRoaXMudmg9ITAsYT0wO2E8dGhpcy5HZC5sZW5ndGg7YSsrKXRoaXMuR2RbYV0uVWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HZFthXS5VYil9fX0pKGMpO3ZhciBsYz1jLktqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBtYz1jLm1rfHxtYztuZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGE9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiOwppZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuR2Moay5EbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuR2Moay5SbSksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciByYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLApwYz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnJoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgucmgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7dmFyIHNjPXJjKGZ1bmN0aW9uKCl7ZS5SZyh3aW5kb3csSC5nbSgpLHtpZDpzY30pfSw1MDApLGhhPWUuWCgxMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYz1jLk9qfHxuYztuZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTGg9CnRoaXMuY29uZj10aGlzLnBiPXRoaXMucGxheWVyPW51bGw7dGhpcy5CZD0wO3RoaXMuZWI9IiI7dGhpcy5IZD1bXTt0aGlzLklkPTA7dGhpcy5OaD0hMTt0aGlzLm5mPVtdO2UucmIoIm5ld0FkZGVsaXZlcnkiKX1jLkJpPWE7YS5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3RoaXMuTGg9YX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlIoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLnBiPWF9LERuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxHYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGN9LFVjOmZ1bmN0aW9uKGEsYyl7ZS5GKCJ3ZWx0LmRlIikmJmUuYmIoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLnBiKTt2YXIgZD0hMSxmPSExO2lmKHRoaXMuaG0oKSl0aGlzLnBiLmkodGhpcy5wYi5LYyx0aGlzLnBiLnFhLHRoaXMucGIucGYsZnVuY3Rpb24oKXt0aGlzLlVjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5wYi5FYyk7ZWxzZSBpZih0aGlzLllsKCkpdGhpcy56bihmdW5jdGlvbigpe3RoaXMuVWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkNjLHRoaXMucGxheWVyLmwoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFlhKHRoaXMuZ2V0UGxheWVyKCksZyk7YyYmbC5lbygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLnJiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1sPW5ldyBQYShsLHRoaXMucGIsZyk7bC5Cbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuSG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5YZSYmKGQ9dGhpcy5wbGF5ZXIuWGUoKSk7Zy5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGcuYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuWmUoYSxkLGYpO3RoaXMucGxheWVyLlloKGwpfX0saG06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5CZClyZXR1cm4gYz1hLmdldFRpbWUoKS10aGlzLkJkLmdldFRpbWUoKSx0aGlzLkJkPWEsM0U1PGM/ITA6ITE7dGhpcy5CZD1hO3JldHVybiExfSxVbjpmdW5jdGlvbigpe2UucmIoInByZXJvbGwiKTsKZS53ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuR2EoImFkVGFnIik7dGhpcy5HYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuR2EoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLk5nKGEpKT90aGlzLlVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9LFRuOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkxoKXtlLndmKCJwb3N0cm9sbCIpO2UucmIoInBvc3Ryb2xsIik7dGhpcy5KbighMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSk7KGQ9dGhpcy5OZyhkKSk/dGhpcy5VYyhkLGMucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsCiEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsucGQsdGhpcy5wbGF5ZXIubCgpKSl9fSxOZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0scm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Sbih0aGlzLlRuLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkthKCl9LE1kOmZ1bmN0aW9uKGEpe2UucmIoIm1pZHJvbGwiKTtlLndmKCJtaWRyb2xsIik7aWYoIXRoaXMuQWgpe3RoaXMuQWg9ITA7dmFyIGM9dGhpcy5HYSgiYWRUYWciKTt0aGlzLkdhKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuVWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSwKdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnBkLHRoaXMucGxheWVyLmwoKSkpfX0scW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jbih0aGlzLk1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmJmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlVuKCk7dGhpcy5wbGF5ZXIuYmYmJnRoaXMucW4oKTt0aGlzLnJuKCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuSGQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmhwKGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsYVtjXS5tYWNybyl9dGhpcy5JZD10aGlzLkhkLmxlbmd0aH0sWWw6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLklkJiYoYT0hMCk7cmV0dXJuIGF9LHpuOmZ1bmN0aW9uKGEpe3RoaXMuTmg9YTtmb3IoYT0wO2E8dGhpcy5IZC5sZW5ndGg7YSsrKXRoaXMuSGRbYV1bImZ1bmN0aW9uIl0odGhpcy5lbi5iaW5kKHRoaXMpKX0sZW46ZnVuY3Rpb24oYSl7dGhpcy5JZC0tO2EmJnRoaXMubmYucHVzaChhKTswPj10aGlzLklkJiZ0aGlzLk5oKCl9LEhtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLm5mLmxlbmd0aDtkKyspYz10aGlzLm5mW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBlYT1jLkJpfHxlYSxRPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy56bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG9jPWMuem18fG9jO25ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpfSkuY2FsbChwYXllb0ZlZUVldmVleGllLApwYXllb0ZlZUVldmVleGllKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.90.4 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.4.90.243.136.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173

Request headers

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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 20 Dec 2019 10:29:41 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
dt
dt.adsafeprotected.com/
43 B
308 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=313194&asId=4ade05b8-c978-060f-6f2d-c3846638c6aa&tv={c:xkRagF,pingTime:1,time:1054,type:p,clog:[{piv:99,vs:i,r:,w:300,h:600,t:17}],es:0,sc:1,ha:1,gmnp:0,for:1,b11:1,cnod:1,gm:0,slTimes:{i:1054,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1303.10.300.600,am:i,cc:1303.10.300.600,piv:99,obst:0,th:0,reas:,bkn:{piv:[1048~75],as:[1048~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:29,fm:rLbID11+1111|1112|12|1311|1312|14|15|161|17|18|19|1a*.313194-41130583|1b|1c|1d|1e,idMap:1a*,rend:1,renddet:XIFRAME.qs.dr,rmeas:1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.39.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
amidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Fri, 20 Dec 2019 10:29:41 GMT
X-Server-Name
dt14ami.ami.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
activeview
pagead2.googlesyndication.com/pcs/ Frame 23D7
42 B
115 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstjv0NfLzsvsJVQ8Y7gf7YgzE9_a0h7tIXwOM1rS5qYGTcQUbb8PlUiUkdfUgZHkVl8C4HV61dSymelovLt0WpZdBrgt8cqEgppYLpVFtQ&sig=Cg0ArKJSzCKnh2Yv2WvjEAE&adk=1956608835&tt=-1&bs=1585%2C1185&mtos=1067,1067,1067,1067,1067&tos=1067,0,0,0,0&p=140,308,390,1278&mcvt=1067&rs=0&ht=0&tfs=129&tls=1196&mc=1&lte=1&bas=0&bac=0&met=mue&la=1&avms=nio&exg=1&md=2&lm=2&rst=1576837779855&dlt&rpt=91&isd=0&msd=0&ext&imams=1&xdi=0&eocm=1&ps=1603%2C12662&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-12-6-11-11-0-0-0&tvt=1192&is=970%2C250&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&wf=0&cac=1&cd=970x250&itpl=3&v=20191206
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
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:41 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 2B1D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuFz3VO-0dhgwbgWJnXV1wzZW2_9Z9hirMo8BfxkFFEPm7ImQnKFSqC1rCcEig2Y9qCv4NuWYQuNrM6rcxBdNey9frdDZIK8V693VwTen0&sig=Cg0ArKJSzJbsOTxpWXglEAE&adk=2740773112&tt=-1&bs=1585%2C1185&mtos=1063,1063,1063,1063,1063&tos=1063,0,0,0,0&p=1008,993,1133,1293&mcvt=1063&rs=0&ht=0&tfs=120&tls=1183&mc=1&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1576837779860&dlt&rpt=77&isd=0&msd=0&ext&imams=1&xdi=0&eocm=1&ps=1603%2C12662&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-3-12-3-11-11-0-0-0&tvt=1181&is=300%2C125&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&wf=0&cac=1&cd=0x0&itpl=19&v=20191206
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
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:41 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
usersync
uss.xplosion.de/
42 B
659 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=49cad897de870846ca57a040b84e4077
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.248.138.214 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-248-138-214.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
Fri, 20 Dec 2019 10:29:41 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
activeview
pagead2.googlesyndication.com/pcs/ Frame 4473
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsszatsDjwItHOWj5-9P6N849rmxFxCQGRNL6cKSQAZZMoiOHF1lo81RmCuKpeEE_JCc2k05DY9vlrufLkfUx_yXlf0WKx_RM2jFt3zPiRw&sig=Cg0ArKJSzNUBdKWe46jzEAE&adk=3876328335&tt=-1&bs=1585%2C1185&mtos=0,1094,1094,1094,1094&tos=0,1094,0,0,0&p=10,1303,610,1603&mcvt=1094&rs=0&ht=0&tfs=131&tls=1225&mc=0.94&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1576837779847&dlt&rpt=182&isd=0&msd=0&ext&imams=1&xdi=0&eocm=1&ps=1603%2C12662&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-12-3-11-11-0-0-0&tvt=1225&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&wf=0&cac=1&cd=0x0&itpl=19&v=20191206
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
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
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
Fri, 20 Dec 2019 10:29:41 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
pd
eu-u.openx.net/w/1.0/ Frame F3BB
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.173.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
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
sec-fetch-mode
nested-navigate
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=f2156e60-a905-012e-0a6a-331f7905fa1f|1576837779
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
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept, Accept-Encoding
set-cookie
i=f2156e60-a905-012e-0a6a-331f7905fa1f|1576837779; Version=1; Expires=Sat, 19-Dec-2020 10:29:43 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1576837783|mOgikimWiygu; Version=1; Expires=Sat, 04-Jan-2020 10:29:43 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.173.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Fri, 20 Dec 2019 10:29:43 GMT
content-type
text/html
content-length
374
content-encoding
gzip
via
1.1 google
alt-svc
clear
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame B893
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
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
Sec-Fetch-Mode
nested-navigate
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
Referer
https://www.golem.de/

Response headers

Last-Modified
Tue, 12 Nov 2019 06:59:02 GMT
ETag
"13006b6-97cd-59720c88c16d1"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
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
14515
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=141915
Expires
Sun, 22 Dec 2019 01:54:58 GMT
Date
Fri, 20 Dec 2019 10:29:43 GMT
Connection
keep-alive
Vary
Accept-Encoding
usync.html
eus.rubiconproject.com/ Frame 2EA0
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.55.184 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-55-184.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
rsid=1|G9C2NkZC7frDQSirzNt8MRPvuJlRI6aSli1gEtfhZ1co9sDCaATiL5HZCune56ebGXOxtVOqDmehEyjLVSL/K1XE6wNU121TpS94OfHaS3J5oG+vEPIAYMXyJPObaA/FUuvBwH9kPDDxxf0zCa0mxZwoDof1EQPFeodkw80=; ses10=; vis10=241806^1; ses15=; vis15=241806^1; khaos=K4E0I18N-16-3R5P; ses55=; vis55=241806^1; audit=1|hLZGFuTafB29un0G+nxqJs1+1ZYfrZ/adPnsZJXRBFW9HKRmYQcxY269RYya3iefwtNXUxOvlNtD+EbPh3UKYNzpQ7vzkXQ/
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
Referer
https://www.golem.de/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Thu, 12 Dec 2019 00:18:57 GMT
Content-Encoding
gzip
Content-Length
7753
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=41412
Expires
Fri, 20 Dec 2019 21:59:55 GMT
Date
Fri, 20 Dec 2019 10:29:43 GMT
Connection
keep-alive
Vary
Accept-Encoding
data
lb33.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb33.s400.meetrics.net/data?//skpKLOBALlnFFUkzFUCPFAAAAAAAABa2YAPBAAFAAa2YTCDTAPAAAXUAKAABCDTAZBAAOA55A55A85B55A58E55A55AGAxwAx3A42ArCDTAPNEAhPAkEBITfPAPAAAXUAKAAHCDTAPAAAAAAAAAKbosAPiJAAAAAAAIbosASksFeFjAAAAAAAAAAAAEAAAa2YAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA52A31Ay1A30AGAkpFylFj0FAAAAJA5xAwwA13AxzA1BEKA1yAyxAxzAy0A52ADAzrF5BFKA1yAyxAxzAy0A52AKA1yAyxAxzAy0A52AxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAACDTAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFXLn3SA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.33.84 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h381.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Fri, 20 Dec 2019 10:29:44 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 20-Dec-19 10:29:43 GMT
dt
dt.adsafeprotected.com/
43 B
308 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=313194&asId=4ade05b8-c978-060f-6f2d-c3846638c6aa&tv={c:xkRbjf,pingTime:5,time:5058,type:p,clog:[{piv:99,vs:i,r:,w:300,h:600,t:17}],es:0,sc:1,ha:1,gmnp:0,for:1,b11:1,cnod:1,gm:0,slTimes:{i:5059,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1303.10.300.600,am:i,cc:1303.10.300.600,piv:99,obst:0,th:0,reas:,bkn:{piv:[5053~75],as:[5053~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:20,fm:rLbID11+1111|1112|12|1311|1312|14|15|161|17|18|19|1a*.313194-41130583|1b|1c|1d|1e,idMap:1a*,rend:1,renddet:XIFRAME.qs.dr,rmeas:1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.39.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
amidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Fri, 20 Dec 2019 10:29:45 GMT
X-Server-Name
dt14ami.ami.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
/
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&1576837789352
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 20 Dec 2019 10:29:49 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

Failed requests

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

Domain
orbidder.otto.de
URL
https://orbidder.otto.de/bid

Verdicts & Comments Add Verdict or Comment

174 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 function| $ function| jQuery function| golemAcceptCookies number| google_srt object| google_ad_modifications object| google_logging_queue boolean| google_measure_js_timing object| google_reactive_ads_global_state boolean| _gfp_a_ object| adsbygoogle object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| stroeerCore function| checkOmid3pExist object| de_meetrics undefined| list boolean| deliveringAds boolean| subDomainCheckVar function| XJNIQdd object| zxqvc8f6Flags string| zxqvc286Rnd object| zxqvcd49etc string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag boolean| zxqvca60sdl boolean| zxqvca60sdln string| zxqvcd49egenat string| zxqvcd49esthash boolean| zxqvc10cforceimp object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq boolean| google_noFetch number| __google_ad_urls_id object| gaGlobal function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired boolean| zxqvc5e7Body boolean| zxqvc467Detect object| zxqvc281Mobile object| zxqvcd49e1 object| zxqvcd49eo1 object| zxqvcd49eo2 object| zxqvcd49eo3 object| zxqvcd49e2 number| zxqvcd49ed3 number| uabInject object| zxqvcd49e4 object| zxqvcd49e5 boolean| zxqvca05ij function| Swiper object| confiant boolean| apstagLOADED object| apstag object| google_tag_manager object| __io object| rmp3pi function| SwfVideo object| exportz object| m string| GoogleAnalyticsObject function| ga function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet number| _m6rApiLoaded object| google_tag_data object| gaplugins object| gaData object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock string| _io_uniques_holing_params object| _m6rOnce number| _m6rContainerLoaded function| confiantTryToGetConfig object| payeoFeeEeveexie function| videopkgInterface 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_138399 object| google_image_requests boolean| zxqvccb9Track object| closure_lm_45680 string| apsrc object| audienceProjectLayer function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr string| hic_qos

21 Cookies

Domain/Path Name / Value
.agkn.com/ Name: ab
Value: 0001%3Awrhmv6Jwb7Evh%2F0hMAk%2FhGLNcn3rbZ7YHcXJu2ftvkfyTkDY68PuNQ%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlj18TJY9fEwAAAAAAAg1RAQCADVIBAIA
www.golem.de/ Name: xdefccpm
Value: no
.golem.de/ Name: _ga
Value: GA1.2.325251954.1576837779
.golem.de/ Name: __io_unique_43098
Value: 20
.golem.de/ Name: __io_uh
Value: 1
www.golem.de/ Name: __io_lv
Value: 1576837779338
.golem.de/ Name: __io_visit_43098
Value: 1
.golem.de/ Name: golem_uv
Value: 5b4d15c9
.golem.de/ Name: golem_us
Value: 5b4d15c9
.golem.de/ Name: __gads
Value: ID=818ea5ba530e3073:T=1576837779:S=ALNI_Ma4c2QPxP6VN6PrltPPzQ8I88YVVw
.golem.de/ Name: golem_viewauto
Value: desktop%3Agoogle_chrome_74
.golem.de/ Name: ioam2018
Value: 000b8c67857a19fd15dfca292:1606472979071:1576837779071:.golem.de:2:golem:GHOME:noevent:1576837779071:9yf8lk
.golem.de/ Name: golem_uz
Value: 5b4d15c9
.doubleclick.net/ Name: DSID
Value: NO_DATA
www.golem.de/ Name: session_id
Value: eebb2572-a6aa-49b6-9eaf-b20a392695a4
.golem.de/ Name: _gat_gtag_UA_518800_2
Value: 1
.golem.de/ Name: Golem_rngnaf
Value: true
.doubleclick.net/ Name: IDE
Value: AHWqTUlta1xNiqAzX3tjHUK2bZPkEaELbB2GgKgGALevvK-97hkIL_cAiaNMunH1
.golem.de/ Name: _gid
Value: GA1.2.484211286.1576837779
.golem.de/ Name: __io
Value: 369b34dee.54f4c6e95_1576837779338

2 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 debug URL: https://static.adsafeprotected.com/sca.17.4.114.js(Line 32)
Message:
a: 0.004150390625ms

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.

account.golem.de
ad.doubleclick.net
ad.yieldlab.net
ads.golem.de
ads.pubmatic.com
adservice.google.be
adservice.google.com
adstax-match.adrtx.net
adx.adform.net
api.theadex.com
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
c.amazon-adsystem.com
cdn-a.yieldlove.com
cdn.adrtx.net
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
dmp.theadex.com
dt.adsafeprotected.com
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.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
lb33.s400.meetrics.net
nugmw.userreport.com
orbidder.otto.de
pagead2.googlesyndication.com
pixel.adsafeprotected.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
s0.2mdn.net
s3.amazonaws.com
s385.mxcdn.net
s400.mxcdn.net
sak.userreport.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
static.adsafeprotected.com
stats.g.doubleclick.net
tpc.googlesyndication.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
orbidder.otto.de
104.244.39.20
13.224.196.125
13.224.199.29
136.243.33.84
136.243.90.4
142.93.164.216
151.101.13.194
172.217.18.162
172.217.21.194
172.217.22.6
185.33.223.221
185.64.189.112
194.213.222.29
199.166.0.26
199.166.0.32
2.18.233.180
2.18.233.67
2.18.234.21
2.18.234.72
23.210.248.245
23.37.53.21
23.37.55.184
23.8.3.208
2600:9000:20c3:1e00:15:efbc:e300:93a1
2600:9000:20c3:f600:1c:8c89:a300:93a1
2600:9000:20eb:ca00:12:6213:9cc0:93a1
2600:9000:2156:3a00:1f:a1b:34c0:93a1
2600:9000:2156:4800:19:fc2c:a140:93a1
2606:4700:20::681a:3cd
2a00:13c8:f5::f:4b3d:148
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:180
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:808::200a
2a00:1450:4001:80b::200e
2a00:1450:4001:816::2002
2a00:1450:4001:81a::2002
2a00:1450:4001:81d::2002
2a00:1450:4001:81e::2002
2a00:1450:4001:81e::2008
2a00:1450:4001:821::2001
2a00:1450:4001:821::2006
2a00:1450:400c:c00::9a
2a02:26f0:6c00:2bc::5f76
3.248.138.214
34.249.185.179
34.95.120.147
35.156.142.194
35.186.238.175
35.206.134.202
37.157.6.252
52.209.100.206
52.216.8.37
69.173.144.142
88.99.5.37
89.163.159.103
89.163.159.125
91.215.100.39
91.215.100.40
99.84.92.30
99.84.92.91
02c362c3d7e4841addf4d931d2048ece57aa4bdc76a33694bb5a7aeea2d1b8b9
03f3c24797882a0a503a4894f5edc07240bb847f9e8c780995a6e2249b4c4302
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
06f6e80c475aefbe6512912c212e5665b92940c5b60b4737f4b1a36e52f3c3a1
0ae5cdcd006a2469999e2896564c3994df320948c609cf7b481d8a94354e6db3
0b1ace9b39cfa2f3de9ebd25c2b2e2b44816502e53809093d2c53dc2898f4d83
0b382ab83bf70e7a2d27d75c78761ec005ccb9d4f6a945174a2b52256bef781a
0c39c021ffc08f13cc0f38f80996cc76081317c2ef84c217904b9d7fa7244feb
0e9dcadab8503e54c51795e42a2eec8c29f52b5cf47ad4776621bf92e8f90a6e
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9
0f196ef81107574f30fb9656eec9a3b59bb27b9d1e82e1a2ce94280527cca46d
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
1557c9ca8e17910f64f1eaf109db6b308665f2b58b8684271f8f225ca416f41d
161795485799eec430715bcc2ded43849db8473da12b5986f40a2f4f84b86cfe
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
16ed47f1cd79f4b87625326a7befd9b70374e4ac4d1b3ca9a5018db0741320aa
1858ca76b1ca359bb47b5c7c52812dfebe7c45488c198b291dc29c55a4353129
1bcdc86e2c79c53cd921ea3fd33e2f1852d45b84ba721bf3632a3ba4c9af8669
1d75226b9c3a814cd603242c75eb0ef9574e5e796f68b96ca579ee13c2bad1ec
1e0163915ca5ce38c406e46ac54e7db51c14f9b5bf8cafa2bdb5b8d2fad98b3c
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
20cdda5f0e51f5dac5693ffe15fb394528dd838e9887a785de1d02e3bb2a418f
215d53c74530f835304166b261caa9b4bd12efbb1aac70acad19e42699bd0919
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
219f49b2af994cde3eb82ab621b6d01a71d2a8ed765524af5f47b1984f44e4bd
22947d33cea928b0ad0ceaac7b7deb0329ba19f4a4e98bc6f4046cc36e5aabb2
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8
2bec3ec9a90f2e8999d3a0706c688cc14cef96fee8915fa68149dfeece8c2ccf
2cfb19ad09fb12096701e1d4568d26aede44ee112e006a6df55f25d15198a73d
2d2dce68b4ab7522b416b88e176ab10d7518c302d96423fb65ffc35e8ae88ae0
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
3389e55442a43bb1e5b47075b1019a42b5f35218f3c544a4add1b5350af760aa
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
341ae8b7babc44d0c3bcf125b6fe8ea3a0a58f3e124b517a311ea01b5dc4da23
341dab5884908aff253104b309d86cee673f4c9bbc94a97fad0932209b657f73
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
390874d6db4a9ee5befa54c41837eca509cb512ebba5fedac48bf6b57bc99710
3d56a84c01b4ef4168492a20787afab2d53432c0c985dfd7610dc419d1751580
3d651deccdbf9555ab9e4174f8d6d43fe5fb40fc74380dda6e9ad3b9c39b085c
3dde182739c95eb8f9a9051bab684d8e9747bc2a239ddcafed4f82a00fd19204
3e24778e9a0c3bb90e05c47658563961ec59598d21e7851f8227c351b45e76d7
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
3ed83fa144ae381e68baecc9859c226a43718f2771544ac5e947804200e5e776
40cd26898c72ca6fac8634371e748332a1bf9dacc066cfcce9117b3d9d553f8f
40dfdbe8a6004a5a45aa80c9bd700a691a1a3af3a8b9ef215710ae3a4ce957f6
411e7dabb047d60b82157a39bb20dcd2c26c5cd975fb63d9244634b72688e098
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
44178919accac2fd92f71084d312c8ff266dd25b8b808f8e9b32fe2926aefb41
44fc6a9636497db1460c3dd74fc5905a0d43efdab8ce9e733cc0ba49d9ff231a
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
486d4d6f315fd46143ff30ef3199086fae315cab2a5c2ad76b825180d64745e4
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b1d78db550a701f7c288f2d22a38e80832bad8172f80807a4b39d2107cfcbbe
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4c52ed8f9039265ffed7fdca0b967b2624325e6356433f437e044b0dd332cddf
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4d16df06e185292468ddbd4a0fa1849da97793ae198952508aa8df37400fe342
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
5039af429db1b523504beca97de1c1e5d7364cfb29b2b6b61da336412c726b9a
52f7d126984a43d18fd6d72cd55df768f17d35cdc84868b13383264c2a111cc5
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
54fcd04765ef279ee48e861ddb168cf571f982bea184f4d451f13fc6bd1dca03
567f8dc3b549b7fad44fe2378ed8e2bcd4a58ad69f0c74991773db9be9e41022
589250dba43180fe0cf7501aba948265021df9e22aa1fb7c8730cbb9103311d2
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5d6e627eebfb92573a88334e7660ecfafad7eeac686575010fa072a52abd07f0
5e148f89fc2e2cd6d7b6d7f9178d8b5331ef618a76718177495700bbe4fab13f
5ed29e1bfc44507f3f926973f447fa508f5f76d2fa88e7ebfdcacc3804a9362f
610f7772eaba86e5daa5311a03ad90fce900deb1cf93453334100640d90bd5e2
61a1467b8f50a64d99427cd8819f6a72791767799707d7da7f5b10ff55f0e51e
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63890326f558587b0840eb0a6e6377f1bf39264e015e568f4c2a03aefce3f929
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
64484f3feac9b54f1e55dd2f98213eeeba00cb8372b5172615239f554577d3b2
66139eb6b84d9595b190aef89ed6775c83d0335bba775ce91459f2975b3bba6b
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
68bcdec2fdc6ce23468b97a8c39a3f9eb86233e03be5072bf3b438ac1433714d
6b7cd7d7128fc70ea412ee9b7fbdb59391ee00ebfc630425b8ee8293e19fff93
6bb4ed6f0ab117491217d63a3e7292fe41d9950d0eb015c0c39a56cf0cf07d10
6e0f0ea93b23784d6d0abff3fbd6cda425f402fe5a22195462528d5621831dd4
6fba68ac9345123605b8512151a8120eb95780ca36f1edb74c910d3683066794
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7207dcdc68b43142844cfef7d74159fa32f94650d5f116272fb3fe19f56b5ff7
745a085b52b8371ec6705413fca70a28c6d8bff0db480e6b124bd08c54e95ef8
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76e1f44da6cd35daa7938a205092e0cc4560e8cf2b24249b9dce3743123375d3
7874e54e29ef8fb866ef14aceee8ed0f348c9814e8f7a8f18ff600798212a9d8
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
8194ff3826976ab39199703c90dca9ddec292bfe5033e69e473f76b7fb8742e5
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
84ad88a69de55847b9f5210b36b7040c716eeb643d29938d2d05e0a7764310d4
8501ff65b7e75cdd2d8cb5432f8df851b13c49b23b81d5f6d8f1baa5751e5f8d
890b5e85d2e2e663f3dd8c35a28cd1f4ec98824d1cc8c2c651b5d17ce4eb1f47
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
918c4485a28931feb333074355c2f4c2e915ffa51fe70b8797e9432c37b22b8f
921d2930dec16635e5b3efee4f21844bc10b8f42f81abb0b89589e9ab8b73b33
939e4ab32c7e889de75d48c3de57a2765fea4a87126c5864567855f87eeda1a7
93d618a89924c2667da76663637c9cb84f5be59d11cee8af7dd9838070178a59
9460f76ac9c42f7dbff3d5128669909d30309c41eaa08582a86cd72403e431c8
94780b14d25642b1c9a4528f29af5abb7a6a5e0ce25c1f4e5c324f087c28bda9
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
973a95841cafe3d3d6293ce2a6dfe568f1b32c1ccd98896af88cd6a9d55aa03f
9798eae2384e93ba3ad0fa97d27aba91e2e412a4f0ea7d9aa7b8194d183dc6aa
9858ff0aa66a5803c9646b127a01d4faf597a17fcd305adc514124b1bb8163be
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a5c265425e9dfa5ff1bc3730a3f7e05f359943444d1b5d0e7d9bffe044e92ee6
aa40665e25d45a876858f4262728780b62ab2a06d2a760b7a7c1f948c0d6f2e2
ac16a4979055cee94ec072e306f51bff5399b3a59917131e777e73a0c0315187
acedd4f604359b5a406494a55b27a73c47ce9413aafeaaab25a97a5cf7660200
ad9ae0374e0334d2511e951a2381a164fa87ce86594fc027d25a8624774c3c96
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b3f72e1980ae38c8289cfccb0d408686a4fef3371ae0c90fbb7139bbe2567f13
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b97a1beae92e51ce5c90e7eac829cf070cfea51f1df4b03863d5f89697f64d11
bc69c49d32fa2730ef2de74fec9d64232ee024b7b1ca51ee170d335ea5726680
bd6099688ed9ad6c658a6b58312e04073a7d75bd070d02e3a1b69eb6612727cf
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05
beb288c285e4af9d8a2def3afe35254b0e473eec16817ecf0cbd810216fa1335
c0afa784e198c08ebe4c79cb9d2f98e0fa407af8738b58f1d7b26f8658c05ed0
c26cbb4d7d73c4f49aebc612c01d789ad4f1aeed4192a7c551d923e8b11c26ce
c2bd1d15393ba9fc013d05d11272c46ab92eb6997515be049e92f0c4b751371a
c3400395b5077fb87f1428e18082f9af8757a42910c1eb99ad26276c1cc8c6a8
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c85a16dbb29515430f9e59a1a762defe4c0497a7801bdd83b4506b5159d5c3ea
c956736e31133e8d1196517b56afb898963225bc543c39f351da21f2f8cfb53c
cd9130e504a38f1f265050aa0b7fe9c86230d41a0d95e2a93873c70443e1ab06
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d1b68c05b19c101d32f1555ab1b493fc450b958011de86f43b4a5aa60028a2a2
d1de02f0667d44eeab1d2bfed8752ce3884aac56125a63db58a54700e987b6d4
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d382b4823d3a796fdb42d1edce45989ef4ea9c41825b31e2c8aabc5aae20b888
d4d2956a2b4f4e52d5d5a78b038aa3586bca0788f89924e2a0c3ffd61e3a2765
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
dbae80178f38cc9ba775c5b35b7323bc6e045e3aa1dec103c1c87a4205494e90
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e22b31a2461fbeadf23eeefa3260fae7a8b3f017f38645ccfd4c7b34b213170e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e6e385435428543fd06add4b6b1fc76beaffbcdeaffb361412d7209e266f6015
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e908b07ec50775b14993219f8fa69e640ae246969e2dcd78be0da72aedad92fa
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
e97ee856bdc72dfb4dd1768660b42200b117c21185c8368e9a39ac7374710402
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ea6ad04bab31cc9c22814f1a3120e6edaaa8b0def84ff0d9fee4c0505ca9c6ea
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f28d2b189936323d183175e1973ddcf3ded6d82cf348cc8f3b966630f43e8667
f33117eacda2949088a603d0f749027c248306843cfee539d101afca48d52bea
f667d52d276680beb7ae41ef52bf3379d4f85fbf128c7a6ecc0fc86665561eec
faff9bde8c15fa486bcca769e03da822cc9fa87a0cb09eaa9d7060372fe7f8f6
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ffdc5ea426aa6f0541b67822b87b963cb379bdda847e6e54edc0de71c81f2023