GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
146 KB
53 KB
|
117ms
100ms
|
Document
text/html |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
15 KB
|
13ms
13ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
9ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
10ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
33ms
6ms
|
Script
application/javascript |
151.101.14.217
Fastly
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-cf939aa283.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
14ms
13ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-5871470d6d.css
www.giga.de/static-local/dist/assets/css/
|
356 KB
49 KB
|
14ms
13ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
34 KB
11 KB
|
30ms
10ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.289a9882b578f36829997a593f422307.js
Show response
js.stroeermediabrands.de/
|
257 KB
62 KB
|
44ms
12ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
37ms
19ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
95 KB
34 KB
|
21ms
19ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e02d515703c7645b1724e0f74e0feffcc591b2988b662de83b2cc6c7bb0375a4
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
152 B
|
9ms
7ms
|
Image
image/gif |
2a00:1450:4001:824::2003
Google LLC
|
|
General
- Full URL
- https://www.gstatic.com/psa/static/1.gif
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
|
6 KB
6 KB
|
36ms
18ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
27 KB
10 KB
|
16ms
1ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
6ms
6ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
323 B
|
18ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8083:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tag.min.js
Show response
get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/
|
70 KB
16 KB
|
25ms
10ms
|
Script
text/javascript |
2600:9000:20bb:a400:1f:287:d20a:ce1
Amazon.com
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-cf939aa283.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
75 KB
22 KB
|
32ms
18ms
|
Script
application/javascript |
143.204.211.231
Amazon.com
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
918 B
|
26ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
29ms
8ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.7250722749098386
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&vr=415&i...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
10ms
9ms
|
Image
image/gif |
91.215.100.40
INFONLINE-AS
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
9 KB
10 KB
|
11ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 83D0
|
9 KB
3 KB
|
41ms
22ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
8ms
7ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
75 KB
25 KB
|
24ms
24ms
|
Script
application/javascript |
2a00:1450:4001:825::200e
Google LLC
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
34ms
10ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.8612135521330118
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 282F
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
25ms
25ms
|
Document
text/html |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
40 KB
12 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- Requested by
- Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.289a9882b578f36829997a593f422307.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 19eecf8f26e673b201eb4708482fd5a672a15c66a8c0492f62ebb3d3f5b70cd0
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
269 KB
84 KB
|
23ms
7ms
|
Script
application/javascript |
143.204.214.67
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
22ms
9ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
97 B
599 B
|
21ms
21ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
rc
Show response
si.nuggad.net/
|
867 B
990 B
|
130ms
25ms
|
Script
text/javascript |
80.82.201.88
UNBELIEVABLE-AS
|
|
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
138 B
449 B
|
55ms
23ms
|
Image
image/png |
35.156.29.62
Amazon.com
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/
|
222 KB
82 KB
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b2cd7de9873f721decdc67b217b48247a2f03deb326a4e8d34bc521cabff5741
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190905/r20190131/
Frame DE0E
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20190905/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:80b::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 |
|
GET
H2
|
200
|
post-4c71d5d921.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
24ms
24ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-6b59f15322.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
23ms
23ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-8069c0d527.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
16 KB
5 KB
|
23ms
23ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
beacon.min.js
Show response
beacon.s-onetag.com/
|
18 KB
6 KB
|
42ms
6ms
|
Script
application/javascript |
2600:9000:20bb:9600:5:9a4c:9b00:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
fpi.js
Show response
ap.lijit.com/www/delivery/
Frame E041
|
5 KB
3 KB
|
55ms
15ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
- Requested by
- Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 1d620a0f7dc002fca2d94bf2da586b9198b9fa94a3b53e9eeb069833081f119d
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
503 B
|
85ms
85ms
|
XHR
text/javascript |
143.204.211.231
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=7286246159041568187288062&cb=2173656070001568187288064&ws=1600x1200&v=7.36.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.211.231
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-211-231.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- a88f634d6fbb391a3ce5cbcb74dfe045a0f6eb7ec91990818a511ed391d80983
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
19ms
6ms
|
XHR
application/javascript |
143.204.211.231
Amazon.com
|
|
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
9ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
52 KB
17 KB
|
60ms
27ms
|
Script
application/javascript |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
videojs-02e1d46d.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 83D0
|
618 KB
206 KB
|
16ms
15ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 83D0
|
255 KB
86 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:809::200a
Google LLC
|
|
|
GET
H2
|
200
|
lOyU-OCKINPe2.gif
www.giga.de/imagez/adbanner2/
|
71 B
474 B
|
33ms
33ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb24.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
18ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/bb-mx/submit?/WWT8BJAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSsIBPAAAAAAAAAOAAAAGBAAAAAAZwSsIBBRksFAQtjFZui9SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
17ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
|
GET
H2
|
200
|
pubads_impl_2019082901.js
Show response
securepubads.g.doubleclick.net/gpt/
|
158 KB
58 KB
|
43ms
43ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
7ms
7ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1568187288126&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
101 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=709463747&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=556966631&gjid=1032615273&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=747857454
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=800166598
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 83D0
|
53 KB
15 KB
|
9ms
8ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 83D0
|
1015 B
1 KB
|
9ms
9ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
rum.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/
|
49 KB
19 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 9b404c617f947b58e4c257e9d622512567b05283f1ce4894b11273982c534f71
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 1173
|
0
0
|
304ms
304ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1568187288&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1568187288003&bpp=9&bdt=170&fdt=208&idt=208&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&correlator=8223080048408&frm=20&pv=2&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=2251851893044128&dssz=62&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060078&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0yT4laeFmO&p=https%3A//www.giga.de&dtd=226
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
76 KB
28 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
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/r20190905/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
39ms
15ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
50 KB
13 KB
|
41ms
11ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
GET
H2
|
200
|
platform.js
Show response
apis.google.com/js/
|
43 KB
17 KB
|
42ms
29ms
|
Script
application/javascript |
2a00:1450:4001:821::200e
Google LLC
|
|
General
- Full URL
- https://apis.google.com/js/platform.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-cf939aa283.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:821::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
9ms
7ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
8ms
6ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=1480758500
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
7ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=1086000241
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
10ms
8ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=922244624
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
10ms
8ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1618141652
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=422699613
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
9ms
7ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=873904352
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
7ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1689286737
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 3AEA
|
0
0
|
21ms
17ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1568187288&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1568187288012&bpp=5&bdt=180&fdt=266&idt=266&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=8223080048408&frm=20&pv=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=3333078966304&dssz=68&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060078&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=271
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::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 |
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
11ms
10ms
|
Script
text/javascript |
2a00:1450:4001:817::200a
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame 043C
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
|
0
0
|
198ms
198ms
|
Document
text/html |
52.94.216.48
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
sync
Show response
ap.lijit.com/
Frame E041
|
49 KB
16 KB
|
29ms
26ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
9ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=386873145
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
28ms
6ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
506 B
|
79ms
78ms
|
XHR
text/javascript |
143.204.211.231
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=7286246159041568187288062&cb=7549509718361568187288331&ws=1600x1200&v=7.36.00&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.211.231
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-211-231.fra53.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- d660ab84478e30350d7dc1aafa87d4eb646645dcd4026f181afd3b10c20db666
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
1 KB
2 KB
|
43ms
42ms
|
XHR
application/json |
185.33.223.216
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
113ms
92ms
|
XHR
application/json |
69.173.144.143
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=76992fa3-469d-4736-a114-a2737cc162ab&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.956746359255878
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.143
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 1b00a5cb16c91a06ace93e2b1bafe7394f3bbeff13b2fcd6ed53f5207e1c9e20
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
127ms
94ms
|
XHR
application/json |
69.173.144.143
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=47f3a270-254a-411d-a6ae-21a81288eea8&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.0419986799788592
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.143
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 5f05a28af8bfc36985245f09034fd8de6794a7deb250aa4476af6569289724b7
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
94ms
62ms
|
XHR
application/json |
69.173.144.143
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=755e5f0a-0f18-4f89-8688-62419c3674cf&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.16370437656178183
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.143
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- a8c233789a814228dc9a80d5a95832045d56912283efa70435e8d3a006404d68
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
24ms
22ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=76992fa3-469d-4736-a114-a2737cc162ab%2C47f3a270-254a-411d-a6ae-21a81288eea8%2C755e5f0a-0f18-4f89-8688-62419c3674cf&nocache=1568187288340&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.161.0 /
- Resource Hash
- a1077ea2c782ef0d45b33880c7ba1fee42a42b145984a64496425d35fbc5284b
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
113 B
|
39ms
14ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
2 KB
2 KB
|
94ms
53ms
|
XHR
application/json |
37.157.4.25
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTc2OTkyZmEzLTQ2OWQtNDczNi1hMTE0LWEyNzM3Y2MxNjJhYg%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTc1NWU1ZjBhLTBmMTgtNGY4OS04Njg4LTYyNDE5YzM2NzRjZg%3D%3D&pt=gross&stid=ffa61990-3905-464a-bc0e-3f1c2333f94e&fd=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.25
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 20344f6c2576e888645689814108b6019491071d53d5f4b3edc294951a5de023
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
11 KB
5 KB
|
295ms
295ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C800x450%7C580x500&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-2%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288373&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2241380529&uci=1&ifi=2&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=71&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 58d9efad2053d80cdfa268429487416fad20a6366343f48c47e8aa8437d7e584
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019082901.js
Show response
securepubads.g.doubleclick.net/gpt/
|
66 KB
25 KB
|
38ms
38ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
|
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
288ms
288ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-2%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288387&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=72&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=640&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 052da30de87681d138df57ad1bf5705fcf879ee1e80cb1cb2e4ced21c1712c91
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
17ms
17ms
|
Stylesheet
text/css |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 83D0
|
30 KB
30 KB
|
29ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
impl.20190908-6-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
393 KB
111 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
10ms
10ms
|
Script
application/x-javascript |
23.43.115.95
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
15 KB
5 KB
|
397ms
397ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C770x250&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cfufrad%2Cfloor&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-2%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288516&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2481209206&uci=3&ifi=4&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 79345021f111ae91aa428a05560bca86eb37eecf8193fb7fb1ed5b4f9e923002
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
390ms
390ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-2%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288523&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1819065434&uci=4&ifi=5&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ff979ff06519d05cc49427b9ab4e5ac99ff71d4eddb15c935f0edc30dbd540ca
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
610ms
609ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-2%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288532&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3179048887&uci=5&ifi=6&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 2a6a6a1287ae0f8efc05591091b90426e98c0ca24e926301086f7bce17cd9423
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=134042310
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
BLOB
|
200
OK
|
f44af6f7-d6b7-484b-872c-66c6b18a2885
https://videos.giga.de/
Frame 83D0
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 83D0
|
53 B
642 B
|
72ms
43ms
|
XHR
application/json |
52.219.73.199
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 83D0
|
265 B
436 B
|
12ms
11ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201908291025/
|
25 KB
10 KB
|
7ms
7ms
|
Script
application/javascript |
151.101.13.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 92f5fdb2be157bac1c050ae74fdd9269b35c817ea16931ae9998c2dc27bfd0c4
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
55ms
9ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:2a
Highwinds Network...
|
|
|
GET
H/1.1
|
200
OK
|
adcfg
Show response
ap.lijit.com/
Frame E041
|
158 B
566 B
|
15ms
15ms
|
Script
application/x-javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 83D0
|
650 B
1 KB
|
109ms
8ms
|
XHR
application/json |
143.204.214.60
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
63ms
62ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n2=3&n3=1&n4=3&n5=3&n6=2&n7=1&n8=1&n9=3&n10=2&n11=1&n12=1&n17=4&n18=2&n20=2&n21=4&n22=4&n39=4&n43=4&n44=3&n46=4&n47=4&n48=4&n55=4&n57=4&n60=3&n67=1&n70=2&n71=7&n75=0&n76=1&n77=0&n78=0&n79=1&n80=0&n81=0&n82=0&n83=0&n84=0&n85=0&n86=0&n87=0&n88=1&n117=4&n118=3&n119=6&n120=2&n121=1&n122=1&n123=2&n127=0&n128=1&n133=1&n95=1&n96=1&n135=9&n15=1&n66=1&n89=1&n90=1&n91=1&n92=3&n93=4&n94=2&n97=1&n98=1&n101=1&n104=1&n106=1&n108=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n148=1&n149=1&n154=1&n155=1&n156=1&n158=1&n159=1&n161=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 53DA
|
0
57 B
|
19ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvJZVnYKtZj0Pfj0E6LXkl2WrnpwopoKHnKElcZ_Dhr92Yug3lFdgTdQ4Cw6ksXlo1LjOEjoQCdcKwItZcvzF-1qHS_QuOTfKjKgYvNQthn9SUbC0XsJT5Zax0Mn5rN4hAkMj6WETvDBnLvEoP42CPykYJpkzNXjRenC5WmrX2SsGUUnR7BWMAssZK4lmbCTI0U7JXQua-pvQPuPdx_pyki7Hu5Il7uexV5RDK_aHamwxGtH8pDFQH7WsxKKLOmmp6hUTnFY080tUVJOGuSbMnZlw&sig=Cg0ArKJSzITv7D8St8ZlEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame 53DA
|
108 KB
108 KB
|
34ms
6ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 53DA
|
75 KB
28 KB
|
98ms
97ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
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_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
58 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=800x450%7C800x450%7C580x500&w=800&h=450
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame FF8F
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvY9ZFUxVLpuDhS-SCvHcaweRY3udbl4lKF8rRVvCXLhnKqM7RIHC03wf8-xtlX4SHXI84XwFUx2VYznKIHrr2hYwGTIFeXonbIkoCOAxySc_V4hoOhpOajTmKUzB8UtuJX0LnqYqOiT...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
43ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
7 KB
2 KB
|
84ms
83ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
314ms
312ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=09%3A34%3A48.805<i=deflated&data=%7B%22id%22%3A29%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1568187288797%2C%22cv%22%3A%2220190908-6-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A4652%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3055.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190908-6-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 567d96c9d8b08252cc609253eb57ad5ae304f8f3b5da57ca6ed9f0d3b7d84b02
|
GET
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
|
0
248 B
|
6ms
6ms
|
Image
text/plain |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 83D0
|
202 KB
59 KB
|
7ms
6ms
|
XHR
application/javascript |
143.204.214.60
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
addelivery
Show response
ap.lijit.com/
Frame E041
|
4 KB
2 KB
|
20ms
19ms
|
Script
application/x-javascript |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/addelivery?zoneid=600632&tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&cb=29807265&mode=1&flv=0.0.0&ifr=true&od=www.giga.de&time=07%3A34%3A48&fd=1&be=sf&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&orig_loc=http%3A%2F%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&abf=true&dpz=false&cv=7a34ad2&dop=0&ndw=1&spif=true&btid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&iv=sf
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/sync
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 0cd88df3a26fa65f5e8a2a0a47829afaed5017169f83145500aa3ebb0c52de60
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
602 B
|
160ms
135ms
|
XHR
application/json |
104.111.246.233
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 53DA
|
43 B
400 B
|
6ms
6ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 53DA
|
43 B
400 B
|
14ms
7ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 53DA
|
43 B
400 B
|
22ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 83D0
|
202 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame F2DF
|
0
48 B
|
18ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv-D496jGRwqnK0dOOf4InVGHaWpr3kG2qm-MXrZKybHe0qdBmLK-3beR1gkK0bh-y56F8ghzwnMYZLbMP7gKMfl4L6beIwv3wkfwzMcaVJDM-EsMtlyoLYDq21C1LlBdTU4OPnyYVCufM9mEwXQay36Wjko8PcTq07lx-B8pwJKQgYf_2KZGehXHFcTQ5URJWT7U2IPqrNxHv6mf-K8uZdgQzzZV-Vhb9GbeY_JN6z80DNKlvhtQL4LObztyM4WAf2UnPM3A_CSAOLBOjmB_q-tUeLgtJ1_nXRWoqjut1t&sig=Cg0ArKJSzH2bAXM2__gDEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
track.adform.net/adfscript/
Frame 111E
|
0
0
|
78ms
37ms
|
Document
text/html |
37.157.4.40
ADFORM
|
|
General
- Full URL
- https://track.adform.net/adfscript/?bn=31959167;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.40
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
/
track.adform.net/adfscript/
Frame CD11
|
0
0
|
76ms
37ms
|
Document
text/html |
37.157.4.40
ADFORM
|
|
General
- Full URL
- https://track.adform.net/adfscript/?bn=31959168;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.40
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame F2DF
|
75 KB
28 KB
|
70ms
70ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
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_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame E788
|
0
57 B
|
17ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss8cohc6935sGBJBdG_OEqJasPIhxzXCzmELP8y0ho-N5_hcnnm_6Ah_luQvi_BwWGhRHn5uZnneB_o5Q92E0eF_nvjkjqHHravm_pq3QaKIfmgrqzA5i-MyPhEbxuASwfGlnvqjdPc5VvAjbCeEbAjdAg9Kbh5lOty9lExSq1Q431jgcPRift7c56OVlSDqeGKUbD00aZEoXOeS3AiaiWVqiHgyW5rLdd1l4k9LuVhQ9FX-AaDQkpc3lhRAlwDEcatj3vzhp4v3IH9WRG_quuWxSnPpaOTkvpnTAh5gJfU&sig=Cg0ArKJSzLXRF2YWfomLEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame E788
|
75 KB
28 KB
|
54ms
54ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
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_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 53DA
|
12 KB
12 KB
|
8ms
7ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg1852701908&startmuted=1&cb=0.15794928716366452&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 7d06f4e5f7a31127824b0a4aa02b95910f8282233a3cdb043b96f0d271f19b41
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 53DA
|
43 B
307 B
|
5ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
5002100619
Show response
dfp-gateway.s-onetag.com/1/4444/
|
109 B
574 B
|
30ms
7ms
|
XHR
application/json |
2600:9000:20bb:5e00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
4482388292
Show response
dfp-gateway.s-onetag.com/1/4444/
|
111 B
575 B
|
30ms
7ms
|
XHR
application/json |
2600:9000:20bb:5e00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
5137180976
Show response
dfp-gateway.s-onetag.com/1/4444/
|
114 B
579 B
|
30ms
7ms
|
XHR
application/json |
2600:9000:20bb:5e00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
sovrn_standalone_beacon.js
Show response
ap.lijit.com/www/sovrn_beacon_standalone/
Frame E041
|
4 KB
2 KB
|
14ms
14ms
|
Script
text/javascript |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 53DA
|
1 KB
1 KB
|
122ms
28ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=8f885e3cee&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- f24cf6322865cc2eff1d20b7cfb90b05a3b32a4054ecd7f92c64f15ca16029d6
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 53DA
|
43 B
307 B
|
7ms
7ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.5914514780747686&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
26ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/54fci680/182yo/2oidc/4c7pc/
|
4 KB
1 KB
|
31ms
28ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
63ff9320-c4ad-4d4f-83ac-67defc2b6508
Show response
t.nativendo.de/cds/tracking/event/
|
0
195 B
|
16ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?aid=182yo&floor=NjNmZjkzMjAtYzRhZC00ZA_2h5qu4x73NIA8lA&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1568187289
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 03CB
|
0
58 B
|
18ms
17ms
|
Fetch
image/gif |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssoaSDU-E6LW84h8FSEsKQWoT08GXOCpjOWQ-TV5R_ioVoRcp9b3_MK-_Fmdk6iYbTdZnrOE1N0ixyzQwLJzSIGDetYQQa6vivAYa6y897amEmYBcLSb8x3YFWR2YX8a_o-NCRUmMiMrPB0vUnVg9dOwEE0unlZus7e9Be2vGYwtINE_XsZwBl9vd27JCqPTqcFRm3BOlht0Gft8awfRGkh0KJA98znmDrZ1rTPAPlfC97VjKvMcNB_WqZNU4ZXek5tF_w1wQmqc1O2KWcVmpFcOZPc6XgAH3Ec1OJM&sig=Cg0ArKJSzEr8StyIKcGAEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
vpt.js
Show response
static.cliipa.com/basev/
Frame 03CB
|
38 KB
11 KB
|
44ms
6ms
|
Script
application/javascript |
69.16.175.10
Highwinds Network...
|
|
General
- Full URL
- https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
69.16.175.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- tlb.hwcdn.net
- Software
-
/
- Resource Hash
- be701739dbd531e7a05df6dea81b4666d177b2ef14503eba47e7bf220959788d
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 03CB
|
75 KB
28 KB
|
40ms
40ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
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_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5005878418
Show response
dfp-gateway.s-onetag.com/1/4444/
|
113 B
577 B
|
6ms
6ms
|
XHR
application/json |
2600:9000:20bb:5e00:a:52eb:a100:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8DJRAAKktFLkqFFlqwF23A52AwwA/k0FGEmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zALlnFBUkzF2BPdPAAAAAAABgcjAPCAAFAAgcjTA5iAPAAAAAAAAABA5iAZBAAOA55A55A85B55A58E55A55AGAx0A1xA40ArA5iAPjBAAAAAAAPA5iAPAAAAAAAAAIA5iASksFSFjAAAAAAAAAAAAEAAAgcjAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAAAAAAAAAAFAAAA5iAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFXWnJUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8ELRAA/k0FHImvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwBELlnFCTkzFtPFAAAAAAAABS1kAPBAAFAAS1kTtadAPAAAFAAS1kTkMnASksFMEjAAAAAAAAAAAAEAAAS1kAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA40A4xAx2A42AGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz3Ax4Aw5A32AGAihFuuFlyFKA1xAz3Ax4Aw5A32AKA1xAz3Ax4Aw5A32AwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFQtjFekEWVA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
4ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8FNRAAUkzFwCPBAA1IASCABtadAZAAAOA55A55A85B55A58E55A55AGAx1Aw4A22ArtadAPBAANUASCABkMnAZAAAOA55A55A85B55A58E55A55AGAx1Aw4A22ArkMnAPAAAKV0AAAjtadAPBAAAAAAAATtadAPAAAKV0AAAjkMnAPAAAAAAAAATkMnASksFuWd1IASCAYLAaBAFAAAtadAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A37AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFzKFL2BFFFllFqsFOKFDFFtkFoGF5wFECFwZFi3FD5B3tBjvF3KF6CFwoExyACrFmaFLMFpBF4xBC4BV2Ff0F66F2NF2EF1PEjuFE1FD3FTWF1UEEQFmtBxtFC2FhaFUUF4JFLiFx2FDIFtZEXmF0fEt4FlrFGjF2ZFNZFkuFjhF0JFGzFsmFGDFzsEwqFGQFO5F3CEzZFI0FKyBszFjqFqxBkWFSHF1EFUIFwQEQwFw4EjtB0wEzxBF1BxfFzBE3XEz2EzNF3TEnRF3YF6mFt4BqxFy1Fw0Fp2FXxBwDEhnF1OFl2FXNFL1FNJFLhFx0A0SF5sErRFJMFWiFtOFouFG2FatFDEFCIFf5FCtByzFfsFVQFwtFNfF1yBHRFqwFOCFEUF40AZFFmPFrlFMXFtREmzEpnF9DEnwBByFLKFT6FL4FZSFHhFflFQyF5FEBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9Bx4A0xAw4Aw1Ax0AJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAdNUASCAgCAYJAFAAAkMnAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A47AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFzKFL2BFFFllFqsFOKFDFFtkFoGF5wFECFwZFi3FD5B3tBjvF3KF6CFwoExyACrFmaFLMFpBF4xBC4BV2Ff0F66F2NF2EF1PEjuFE1FD3FTWF1UEEQFmtBxtFC2FhaFUUF4JFLiFx2FDIFtZEXmF0fEt4FlrFGjF2ZFNZFkuFjhF0JFGzFsmFGDFzsEwqFGQFO5F3CEzZFI0FKyBszFjqFqxBkWFSHF1EFUIFwQEQwFw4EjtB0wEzxBF1BxfFzBE3XEz2EzNF3TEnRF3YF6mFt4BqxFy1Fw0Fp2FXxBwDEhnF1OFl2FXNFL1FNJFLhFx0A0SF5sErRFJMFWiFtOFouFG2FatFDEFCIFf5FCtByzFfsFVQFwtFNfF1yBHRFqwFOCFEUF40AZFFmPFrlFMXFtREmzEpnF9DEnwBByFLKFT6FL4FZSFHhFflFQyF5FEBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9Bx4A0xAw4Aw1Ax0AJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjF2r74YA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
3ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8GQRAA/k0FNMmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3BELlnFDTkzF8PAAA1IASCABKV0APAAAFAAS1kTKV0APDAAAAAAAABR3VAPAAAFAAR3VTUOaASksFnFd1IASCA4NAYJAFAAAKV0AOAxyAw0A5zAfxB2wA10A4fEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAjAAAAAAAAAAAAEAAAR3VAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA4wAw4E01AwBEMAxzA4yA21Aw1A32Ay0AGAkpFylFj0FAAAAKAxwA10A05Ax2A11AKA1wAwyAxwAw2Ax5AIAwvFz0FlyFhkFKA1wAwyAxwAw2Ax5AKA1wAwyAxwAw2Ax5AyAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFQtjFSTHxYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8HaRAATkzF6PAAA/EAAKABUOaAZBAAOA55A55A85B55A58E55A55AFA45A11AzBErUOaARksF3d/EAAKAxJAAAAFAAAUOaAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjF/qjPSA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8IaRAA/k0FHQmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3mEvyFthF0jFvkFl9BisFvjFrlFymBhkF29B0zA2yA5xA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xAz3Ax4Aw5A32AmjEpkF9xAz4Ay4A1xA0xAw3AzmAzpF6lF9xAywA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xAz3Ax4Aw5A32AmhEwkF91AxzA3xA4wA53A2mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45AywA3BELlnFETkzFARksFAQtjFudalYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
Cookie set
beacon
gslbeacon.lijit.com/
Frame D812
|
0
0
|
57ms
16ms
|
Document
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://gslbeacon.lijit.com/beacon?viewId=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&rand=5462&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/sync
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
|
GET
H/1.1
|
200
OK
|
containertag
Show response
ap.lijit.com/
Frame E041
|
56 KB
7 KB
|
21ms
20ms
|
Script
text/html |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
impression
vap3ams1.lijit.com/addelivery/
Frame E041
|
43 B
564 B
|
58ms
13ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://vap3ams1.lijit.com/addelivery/impression?bannerid=214932&campaignid=232&cb=29807265&tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&cids=232&bids=214932&tss=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
fp
vap3ams1.lijit.com/data/
Frame E041
|
43 B
207 B
|
62ms
16ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://vap3ams1.lijit.com/data/fp?tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&starttime=1568187288661&adcfg=6&adcfg_response=221&addelivery=225&addelivery_response=495&lgfired=554&beacon=558&container=593&EOL=594&ctstart=559&elapsed_ms=594
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
podlogging
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
27 KB
27 KB
|
19ms
19ms
|
Script
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1568187289275&tagid=&cntry=DE&platform=1&sesid=11f8e7cbc40a23ba3ede232562103614&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1568187288797&geolat=&geoing=&deviceifa=&appid=&sd=v2_11f8e7cbc40a23ba3ede232562103614_b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918_1568187288_1568187288_CNawjgYQrMVBGN2Z_PnRLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=e35db710996eade422f43643e27bb57f&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- a04fc6430fced9fbcb030d0affb35b5a022e89da03bb0293b6f11ce5309fd5b3
|
GET
H2
|
200
|
feed-card-placeholder.20190908-6-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
|
4 KB
2 KB
|
6ms
5ms
|
Image
image/svg+xml |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20190908-6-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
sync
rtb.mfadsrvr.com/ul_cb/
Frame 0EBC
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
|
43 B
300 B
|
65ms
62ms
|
Image
image/gif |
18.196.130.47
Amazon.com
|
|
|
GET
H2
|
400
|
/
trc.taboola.com/sg/rubicon-network-display/1/rtb-h/
Frame 0EBC
Redirect Chain
-
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
-
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
|
0
0
|
121ms
10ms
|
Image
text/html |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 0EBC
Redirect Chain
-
https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
-
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%3D
|
45 B
103 B
|
25ms
14ms
|
Image
image/gif |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/appnexus-network/1/
Frame 0EBC
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=4604369351475478241
-
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
|
0
52 B
|
57ms
53ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame 0EBC
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%26goo...
|
0
52 B
|
56ms
53ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/
Frame 0EBC
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=4604369351475478241
|
0
49 B
|
68ms
63ms
|
Image
text/plain |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=4604369351475478241
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame 0EBC
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da...
|
0
52 B
|
13ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da-a4e2-e4ecbab05e91
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame 0EBC
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-92...
|
0
52 B
|
15ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-9220-16d00120d950
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame 0EBC
|
35 B
380 B
|
163ms
162ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame 0EBC
|
0
292 B
|
378ms
122ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame 0EBC
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://pixel.quantserve.com/pixel/p-zLwwakwy-hZw3.gif?idmatch=0&ssp=taboola
-
https://x.bidswitch.net/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97
-
https://x.bidswitch.net/ul_cb/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be...
|
0
52 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be09-7ec805382302
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
8ms
6ms
|
Image
image/gif |
2a00:1450:4001:825::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=1670472973
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H/1.1
|
200
OK
|
vast
Show response
tracking.m6r.eu/sync/
Frame 53DA
|
490 B
926 B
|
61ms
26ms
|
XHR
text/xml |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D8f885e3cee%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D0c7847b4-8941-4e64-bf2f-6ccbc3da1cad
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 2406df3da85e2fe3a84e07b048e0b2a3ff1272af51ea78914d542cca9720a2bf
|
GET
H2
|
200
|
5005878418
Show response
dfp-gateway.s-onetag.com/1/4444/
|
113 B
576 B
|
16ms
6ms
|
XHR
application/json |
2600:9000:20bb:5e00:a:52eb:a100:93a1
Amazon.com
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 B
|
26ms
20ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
70 B
|
23ms
18ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
231 B
|
17ms
14ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
54 B
|
17ms
15ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
546 B
928 B
|
16ms
16ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
image.jpg
c.nativendo.de/cdn/asset/media/crt/23061/2/3/
|
24 KB
25 KB
|
174ms
0ms
|
Image
image/jpeg |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
63ff9320-c4ad-4d4f-83ac-67defc2b6508
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
195ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1568187289
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H/1.1
|
200
OK
|
extend
Show response
bis.cliipa.com/event/
Frame 03CB
|
0
438 B
|
103ms
102ms
|
XHR
text/plain |
54.243.114.159
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
json
Show response
server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/
Frame 03CB
|
19 KB
9 KB
|
407ms
111ms
|
XHR
application/json |
54.243.119.74
Amazon.com
|
|
General
- Full URL
- https://server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/json?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ref=www.giga.de&st=true&cb=1568187289554
- Requested by
- Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.243.119.74
Ashburn, United States,
ASN14618
(AMAZON-AES - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-243-119-74.compute-1.amazonaws.com
- Software
-
Cowboy /
- Resource Hash
- bdc68de5e41eec35b166fa018d3fb6522ba56ad797917fdb0804fd13419ba8c1
|
GET
H/1.1
|
200
OK
|
tag.aspx
Show response
ml314.com/
Frame E041
|
26 KB
12 KB
|
221ms
28ms
|
Script
application/javascript |
52.31.106.135
Amazon.com
|
|
|
GET
H2
|
200
|
ids.js
Show response
cdn.tynt.com/
|
10 KB
4 KB
|
113ms
11ms
|
Script
application/javascript |
104.16.87.26
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
sovrn
Show response
pd.sharethis.com/pd/
Frame E041
|
0
170 B
|
91ms
7ms
|
Script
application/javascript |
18.185.201.52
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
pixel
Show response
ps.eyeota.net/
Frame E041
|
0
141 B
|
34ms
6ms
|
Script
text/plain |
54.93.117.16
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
merge
ce.lijit.com/
Frame E041
Redirect Chain
-
https://ce.lijit.com/merge?pid=5176&3pid=1
-
https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=1
|
0
403 B
|
14ms
13ms
|
Image
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
merge
ce.lijit.com/
Frame E041
Redirect Chain
-
https://bcp.crwdcntrl.net/5/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id}
-
https://bcp.crwdcntrl.net/5/ct=y/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id}
-
https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
|
0
403 B
|
15ms
15ms
|
Image
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
validateCookie
segments.company-target.com/
Frame E041
Redirect Chain
-
https://segments.company-target.com/log?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e
-
https://segments.company-target.com/validateCookie?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e&verifyHash=46ab6971e7da86cac29495c37bc34111e18876b2
|
26 B
390 B
|
97ms
94ms
|
Image
image/gif |
143.204.214.70
Amazon.com
|
|
|
GET
H2
|
200
|
/
p.adsymptotic.com/d/px/
Frame E041
|
43 B
339 B
|
171ms
94ms
|
Image
image/gif |
104.18.102.194
Cloudflare
|
|
General
- Full URL
- https://p.adsymptotic.com/d/px/?_pid=15697&_psign=0a885fb568701ac53478d88866a10345&_pu&_puuid=de2e0b8c7ff08336dcad6b3e&_redirect=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5014%263pid%3D${UUID}&_rand=1457107
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.18.102.194
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
204
No Content
|
collect
dx.bigsea.weborama.com/
Frame E041
Redirect Chain
-
https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e
-
https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e&bounced=1&rn=333754
-
https://rd.frontend.weborama.fr/rd?url=https%3A%2F%2Fdx.bigsea.weborama.com%2Fcollect%3Fdsp_id%3D0%26eid%3D%7BWEBO_ID%7D
-
https://dx.bigsea.weborama.com/collect?dsp_id=0&eid=ABt2rDP@fJAA
|
0
628 B
|
29ms
28ms
|
Image
text/plain |
52.31.41.246
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
ct
ap.lijit.com/data/
Frame E041
|
43 B
207 B
|
54ms
54ms
|
Image
image/gif |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/data/ct?tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&cid=18&geo=DE&all_tags=130%2C133%2C134%2C138%2C151%2C174%2C185%2C203%2C205%2C206%2C211%2C234%2C239%2C241%2C248%2C265%2C277%2C309%2C331%2C332%2C333%2C334%2C335%2C336%2C369%2C380%2C381%2C383%2C388%2C396%2C413%2C415%2C417%2C420%2C421%2C423%2C429%2C444%2C450%2C454%2C455%2C460%2C466%2C472&tss=344%2C345%2C350%2C351%2C353%2C354%2C356%2C357&fired_tags=138%2C151%2C234%2C265%2C309%2C369%2C388%2C421&count=8&status=8%2C8%2C8%2C1%2C1%2C8%2C12%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8&elapsed_ms=362
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
podlogging
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
63ff9320-c4ad-4d4f-83ac-67defc2b6508
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
69ms
64ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?noc=54fci680&aid=182yo&cid=2oidc&cti=4c7pc&imp=7&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1568187289
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 53DA
|
48 B
567 B
|
197ms
190ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=8f885e3cee&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=0c7847b4-8941-4e64-bf2f-6ccbc3da1cad
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 83D0
|
53 B
642 B
|
15ms
9ms
|
XHR
application/json |
52.219.73.199
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=4754687769
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.199
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 83D0
|
265 B
436 B
|
13ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=2846364753
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
9ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
707 B
|
10ms
5ms
|
Image
image/png |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
DATA
|
200
OK
|
truncated
/
Frame 03CB
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
3ms
2ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8J5YAAUkzFUCPJAAAAAAAABevQAPAAAFAAevQTmxfAPAAAAAAAAABmxfAZAAAOA55A55A85B55A58E55A55AFA24A13A0BErmxfAPNHA/EAAKAHUOaAPAAA1IASCAHtadAPAAAAAAAAAImxfAPBAANUASCAHkMnASksFAFjAAAAAAAAAAAAEAAAevQAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA41Ax0AxwA3zAGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz3Ax4Aw5A32ADAzrF5BFKA1xAz3Ax4Aw5A32AKA1xAz3Ax4Aw5A32AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdAAAAAAAAAAAAFAAAmxfAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFppdxSA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8K6YAA/k0FWUmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3mEvyFthF0jFvkFl9BisFvjFrlFymBhkF29B0zA2yA5xA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xAz3Ax4Aw5A32AmjEpkF9xAz4Ay4A1xA0xAw3AzmAzpF6lF9xAywA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xAz3Ax4Aw5A32AmhEwkF91AxzA3xA4wA53A2mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45AywA3mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BxzAxxA12A4xA1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwA14A34A0xA4mAjpFk9BxzA4yA21AwwAz2AyzAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91AwwA14A34A0xA4mAhwFk9B1wAw1A43A40Ax4AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A52A43ATkzFARksFAQtjFO0ONcA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 83D0
|
650 B
1 KB
|
9ms
6ms
|
XHR
application/json |
143.204.214.60
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7598288660
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.214.60
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-214-60.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame C77A
Redirect Chain
-
https://ih.adscale.de/map?format=display&ssl=1
-
https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
|
0
0
|
68ms
67ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
Frame A62C
Redirect Chain
-
https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F362bbab8f...
-
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
|
49 B
487 B
|
26ms
25ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
General
- Full URL
- https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.72
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-72.deploy.static.akamaitechnologies.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/642368ed1fe772773708c70d99e101f02e0e0cda/
Frame 83D0
|
650 B
1 KB
|
171ms
82ms
|
XHR
application/json |
144.76.115.247
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/642368ed1fe772773708c70d99e101f02e0e0cda/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.247
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.247.115.76.144.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
294 B
|
393ms
115ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
General
- Full URL
- https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
208.100.17.185
Chicago, United States,
ASN32748
(STEADFAST - Steadfast, US),
- Reverse DNS
- ip185.208-100-17.static.steadfastdns.net
- Software
-
nginx/1.14.0 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame A109
|
0
0
|
20ms
13ms
|
Document
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=888CF1732517504431055646127&cicmp=1657475&cijs=1&dast=V7fIQCFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosthsdpPhYjVaTSHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDAIqD4Vx368tudLg-L7s_AAAeAkAAAAYUSAAGcJpKACpyDk4AAAAAAAAAAFj-____YwD0iM9kADKUBm8MegAefAAehAAAALKGaJGuMQevfh6ICg6LGAEAAABAMrV5HE3qhMqiCgCAIN0K4AoAIKDt48dhOEt3UOItDAAAgGBsgR4Wv9_ssGv8bpcBAAAAAAAAAJj9n_2jCRGNuaUFsRTwqv0CAgCs_QICALCpGwDAWwBc0AXA6gxishntJrMDAAAAuPv____XA4nFzLjybSwe02Bh2UwcnpXJZdlMVrPJYrCZLUbbGyofot7cNYLpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhBHbZuIxLnxryWphcouWG99aONrM1jKLbWUczVaDwcS5Fr0-ptNuMlkuhlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8ZiZlz5NhaPabCwbCYOz8rksmwmq9lkMdjMFqN9xbaZeIwL31qyWpjcouXGtxaONrO1zGJbGUez1WAwca5Fr4_ptJtMlovhvrGaDRfD3WQ43DdWs-FiuJsMh_sOneG7-pyNyptW4dEp036hbilzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTpReVYji28xWC5nK4fJZZpMZqbNbLRZWXYTi2s3s4glStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HAY!&excid=22&tst=1&docw=0
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/23_11_1/infra/
|
749 KB
177 KB
|
58ms
58ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/23_11_1/infra/cmTagFEED_MANAGER.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 3129f79d675b722127fb444575457ed12ff5341b4309541e5b4c5e14fc421135
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_11_1/assets/css/
|
34 KB
7 KB
|
57ms
56ms
|
Stylesheet
text/css |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/units/23_11_1/assets/css/cmOsUnit.css
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- d414d33904b7f1f70da24215298772bbe90ded3c70d5a9f96ec8eeac147181cb
|
GET
H/1.1
|
200
OK
|
xiw
tracker-adserver.ibillboard.com/error/impid/0c7847b4-8941-4e64-bf2f-6ccbc3da1cad/iid/225bf526-cc90-41db-a82d-1ae9b6021395/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame 53DA
|
0
272 B
|
133ms
24ms
|
Image
text/plain |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/0c7847b4-8941-4e64-bf2f-6ccbc3da1cad/iid/225bf526-cc90-41db-a82d-1ae9b6021395/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/xiw?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame 53DA
|
1 KB
827 B
|
24ms
6ms
|
Script
application/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
712 KB
186 KB
|
6ms
6ms
|
Script
text/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 83D0
|
24 B
356 B
|
19ms
1ms
|
Script
application/octet-stream |
144.76.115.247
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.247
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.247.115.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.1 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame FF6E
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/15538f53e6e1c3f5d790afa0c1cd2c2fd9388c0c/
Frame 83D0
|
109 B
671 B
|
6ms
5ms
|
XHR
application/json |
144.76.115.247
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/15538f53e6e1c3f5d790afa0c1cd2c2fd9388c0c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.247
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.247.115.76.144.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.giga.de/a38e51f61fb7e0f07b113ff7d888037a9bb4caef/
Frame 83D0
|
42 B
875 B
|
70ms
69ms
|
XHR
image/gif |
144.76.115.247
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/a38e51f61fb7e0f07b113ff7d888037a9bb4caef/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.115.247
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.247.115.76.144.clients.your-server.de
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 9A65
|
0
0
|
107ms
11ms
|
Document
text/html |
2a02:26f0:6c00:290::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:290::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame 24F5
|
0
0
|
89ms
11ms
|
Document
text/html |
2a02:26f0:6c00:290::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:290::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290118&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290118&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
13ms
11ms
|
Image
image/gif |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290118&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=72567591&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
76ms
65ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
76ms
64ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290162&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290162&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
10ms
9ms
|
Image
image/gif |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1568187290162&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=46295054&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
75ms
64ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
75ms
65ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
73ms
65ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=100
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
74ms
66ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=100
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
v2
Show response
de.tynt.com/deb/
|
4 B
200 B
|
398ms
116ms
|
Script
application/javascript |
208.100.17.187
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
114ms
114ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
General
- Full URL
- https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
208.100.17.185
Chicago, United States,
ASN32748
(STEADFAST - Steadfast, US),
- Reverse DNS
- ip185.208-100-17.static.steadfastdns.net
- Software
-
nginx/1.14.0 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 3EE4
|
0
0
|
84ms
81ms
|
Document
text/html |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=73584&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&gdprIab={%22status%22:21,%22consent%22:%22%22,%22reason%22:210}&env=js-web&1568187290259
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
83ms
81ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
29ms
28ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
beacon
ap.lijit.com/
Frame 2673
|
0
0
|
14ms
13ms
|
Document
text/html |
72.251.249.9
Internap Corporation
|
|
General
- Full URL
- https://ap.lijit.com/beacon?informer=13413818&gdpr_consent=
- Requested by
- Host: ap.lijit.com
URL: https://ap.lijit.com/www/sovrn_beacon_standalone/sovrn_standalone_beacon.js?iid=13413818
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
72.251.249.9
Amsterdam, Netherlands,
ASN29791
(VOXEL-DOT-NET - Internap Corporation, US),
- Reverse DNS
- Software
-
nginx /
raptor
- Resource Hash
|
GET
H/1.1
|
200
OK
|
sbt.js
Show response
static.cliipa.com/basev/1.0.304/
Frame 03CB
|
517 KB
116 KB
|
8ms
8ms
|
Script
application/javascript |
69.16.175.10
Highwinds Network...
|
|
General
- Full URL
- https://static.cliipa.com/basev/1.0.304/sbt.js
- Requested by
- Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel¯os[regs_gdpr]=1¯os[user_consent]=2
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
69.16.175.10
Phoenix, United States,
ASN20446
(HIGHWINDS3 - Highwinds Network Group, Inc., US),
- Reverse DNS
- tlb.hwcdn.net
- Software
-
/
- Resource Hash
- 30c40c7680ec2abf1393464c9c0823cae8bf9e8b61a911a7baed8170b43e8621
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
114ms
114ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
|
GET
BLOB
|
200
OK
|
5ea06bc1-fd62-4ac7-b19e-a890e0032537
https://www.giga.de/
Frame 03CB
|
1 KB
0
|
|
Other
text/plain |
|
|
|
GET
BLOB
|
200
OK
|
185b9867-37be-45f1-b871-5c1b0418a6f1
https://www.giga.de/
Frame 03CB
|
1 KB
0
|
|
Other
text/plain |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 03CB
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 03CB
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame B8C8
|
40 KB
12 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
|
GET
|
|
5a69aeaaaf6e230004edde93.mp4
inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a69aeaaaf6e230004edde93/
Frame 03CB
|
0
0
|
|
|
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
129ms
129ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
|
GET
H2
|
200
|
pubads_impl_2019082901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B8C8
|
158 KB
58 KB
|
40ms
40ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame B8C8
|
113 B
178 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame B8C8
|
76 KB
23 KB
|
386ms
385ms
|
XHR
text/plain |
216.58.206.2
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3365265194975263&correlator=1183254271221861&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=20194812%2C21061864%2C21062832%2C21064170&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=%2F5286166%2Fgiga.de%2FVidazoo-Passback-300x250&sz=300x250&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&lmt=1568187290&dt=1568187290815&dlt=1568187290677&idt=130&ea=0&frm=23&biw=1585&bih=1200&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3503934010&uci=l4nmzjz8qb14&ifi=1&ifk=2079463813&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=2&iag=15&url=https%3A%2F%2Fwww.giga.de%2Fdownloads%2Fmicrosoft-word-2013%2Ftipps%2Fgroesser-und-kleiner-gleich-zeichen-auf-der-tastatur-in-word-excel-und-co.-schreiben%2F&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=2&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=2074368631.1568187291&ga_sid=1568187291&ga_hid=1481986177&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 006ba866764b4961682453ca84b693d9edda4e6b329bc3ecabf7e417bb3c0caa
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019082901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame B8C8
|
66 KB
25 KB
|
39ms
39ms
|
Script
text/javascript |
216.58.206.2
Google LLC
|
|
|
GET
|
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame B8C8
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 03CB
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuUKgV66dJgMlVskuRnHZDclD9dZLLTo6hWY4mloc-1IK-3cNFDfpSqzLFGUTC5ioPVBgECmEzUV1TVXlZMndqmSDZM-7JVCh618rlFn1k&sig=Cg0ArKJSzA6lbVkwXjqmEAE&adk=3179048887&tt=-1&bs=1585%2C1200&mtos=1058,1058,1058,1058,1058&tos=1058,0,0,0,0&p=278,967.5,528,1267.5&mcvt=1058&rs=3&ht=0&tfs=1344&tls=2402&mc=1<e=1&bas=0&bac=0&met=0&avms=nio&niot_obs=755&niot_cbk=839&md=2&rst=1568187289173&rpt=516&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1585%2C6164&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-16-16-15-98-14-0-0-0&tvt=2396&r=v&id=osdim&vs=4&uc=9&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190909
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
114ms
114ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
114ms
114ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
|
GET
H2
|
204
|
p
ic.tynt.com/b/
|
0
119 B
|
114ms
114ms
|
Image
text/plain |
208.100.17.185
Steadfast
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
11 KB
11 KB
|
9ms
3ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/
|
676 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/OvaMediaPlayer.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f49737b6c3e21187c8bbeb786a2657904a47ba34b42f12752f4e7fafb5889e7a
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
143 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&pix=31589837&cb=1568187291250&uv=23111&abt=des_vB!expl_vA!rtnf3_vB!sac5_vB!ufm_vA&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&pix=&cb=1568187291278&uv=23111&abt=des_vB!expl_vA!rtnf3_vB!sac5_vB!ufm_vA&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
18 KB
19 KB
|
7ms
7ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
246 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8083:face:b00c:0:25de
Facebook
|
|
|
GET
BLOB
|
206
Partial Content
|
e2db082d-affd-4f1e-8d77-fb832da38e77
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
c97bd604-a1e4-418d-9cb0-807f393e4bba
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
7ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/607/2256/s/
|
39 KB
14 KB
|
55ms
18ms
|
Script
application/javascript |
89.163.159.108
MYLOC-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
55ms
19ms
|
Script
application/javascript |
89.163.159.108
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
94ms
21ms
|
Script
application/javascript |
194.213.222.29
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
31ms
31ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
|
GET
H/1.1
|
200
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
673 B
|
32ms
7ms
|
Image
image/gif |
52.28.206.36
Amazon.com
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 77EA
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:825::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::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 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame B8C8
|
76 KB
28 KB
|
63ms
63ms
|
Script
text/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/
|
14 KB
3 KB
|
6ms
5ms
|
Stylesheet
text/css |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/player.css
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5
|
GET
H2
|
200
|
dsm.js
Show response
vidstat.taboola.com/vpaid/ds/176/
|
1 KB
761 B
|
6ms
5ms
|
Script
application/octet-stream |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
15ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&uv=23111&unm=FEED_MANAGER&cb=1568187291452&abt=des_vB!expl_vA!rtnf3_vB!sac5_vB!ufm_vA&baseReportD=taboola.com&dataCenter=am&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
1ms
1ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1568187291489.935660623
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.2/
|
4 KB
2 KB
|
26ms
10ms
|
Script
application/javascript |
2600:9000:20bb:3600:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
34ms
10ms
|
Script
text/plain |
89.163.159.125
MYLOC-AS
|
|
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
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
32ms
32ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=e31d4beb14948a7bc188c1d3a9a51832&event_id=page_view&_sid=69511&_ver=0.2.2&_seg=jsonp&_=326828944560
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.2/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.208.73.164
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 6ded010a9d7f3cf4f895f33dc0ca854e8b1a20ac456caf2f30d1d06855a5b0d6
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
123ms
36ms
|
Script
application/javascript |
34.250.43.132
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 5984
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCEiU3Ws7ZBSaCWDUkWsfABifABSfABSfABi7ABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4203577252589578194
|
42 B
662 B
|
33ms
31ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 9BCF
|
0
0
|
133ms
28ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
General
- Full URL
- https://adstax-match.adrtx.net/activation?receiverId=adaud
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.248.95.73
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
- Software
-
akka-http/10.1.9 /
- Resource Hash
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
31ms
31ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
POST
H2
|
204
|
csi
csi.gstatic.com/
|
0
56 B
|
55ms
54ms
|
Other
image/gif |
2a00:1450:4002:808::2003
Google LLC
|
|
General
- Full URL
- https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k0ey7zsy&c=8223080048408&e=20199335%2C21060078&ctx=1&met.9=1.b0&met.1=1.k0ey7zc0~6.0~7.1~8.2~9.2~10.h~11.8~12.h~13.3a~14.3l~15.3c~16.76~17.7o~18.7u~19.2oo~20.2op~21.2ow~22.4z~23.4z
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4002:808::2003
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
204
|
csi
csi.gstatic.com/
|
0
56 B
|
55ms
54ms
|
Other
image/gif |
2a00:1450:4002:808::2003
Google LLC
|
|
General
- Full URL
- https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k0ey7zsz&c=8223080048408&e=20199335%2C21060078&ctx=1&met.9=2.hv&met.1=1.k0ey7zc0~6.0~7.1~8.2~9.2~10.h~11.8~12.h~13.3a~14.3l~15.3c~16.76~17.7o~18.7u~19.2oo~20.2op~21.2ow~22.4z~23.4z
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4002:808::2003
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 5D94
Redirect Chain
-
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
-
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
|
0
0
|
24ms
24ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.161.0 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 0192
|
0
0
|
30ms
10ms
|
Document
text/html |
2.18.232.130
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.130
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame 0C88
|
0
0
|
23ms
7ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame 0C80
|
0
0
|
79ms
49ms
|
Document
text/html |
104.111.230.142
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
utsync.ashx
Show response
ml314.com/
Frame E041
|
573 B
1 KB
|
69ms
69ms
|
Script
application/javascript |
52.31.106.135
Amazon.com
|
|
General
- Full URL
- https://ml314.com/utsync.ashx?pub=&adv=&et=0&eid=50282&ct=js&pi=&fp=&clid=&if=1&ps=&cl=&mlt=&data=&&cp=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pv=1568187289853_kzef93p31&bl=en-us&cb=2676425&return=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5031%263pid%3D%5BPersonID%5D&ht=&d=&dc=&si=1568187289853_kzef93p31&cid=&s=1600x1200&rp=
- Requested by
- Host: ml314.com
URL: https://ml314.com/tag.aspx?118
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.31.106.135
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
- Software
-
Microsoft-IIS/10.0 /
ASP.NET
- Resource Hash
- 14292f59d04484f19cd16c904540ad0a09e9bfa1243ba5f87193b86567c71ec6
|
GET
H/1.1
|
200
OK
|
csync.ashx
ml314.com/
Frame E041
Redirect Chain
-
https://ib.adnxs.com/getuid?https://ml314.com/csync.ashx%3Ffp=$UID%26person_id=5978151496344721696%26eid=2
-
https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fml314.com%2Fcsync.ashx%253Ffp%3D%24UID%2526person_id%3D5978151496344721696%2526eid%3D2
-
https://ml314.com/csync.ashx?fp=3739492794812319017&person_id=5978151496344721696&eid=2
|
43 B
312 B
|
28ms
28ms
|
Image
image/gif |
52.31.106.135
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
csync.ashx
ml314.com/
Frame E041
Redirect Chain
-
https://tags.bluekai.com/site/20486?limit=0&id=5978151496344721696&redir=https://ml314.com/csync.ashx%3Ffp=$_BK_UUID%26person_id=5978151496344721696%26eid=50056
-
https://ml314.com/csync.ashx?fp=37f1mx9999YqXlC5&person_id=5978151496344721696&eid=50056
|
43 B
312 B
|
29ms
28ms
|
Image
image/gif |
52.31.106.135
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
match
ps.eyeota.net/
Frame E041
Redirect Chain
-
https://ps.eyeota.net/pixel?pid=r8hrb20&t=gif
-
https://ps.eyeota.net/pixel/bounce/?pid=r8hrb20&t=gif
-
https://ml314.com/utsync.ashx?eid=50052&et=0&fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&gdpr=1&gdpr_consent=&return=https%3A%2F%2Fps.eyeota.net%2Fmatch%3Fbid%3Dr8hrb20%26uid%3Dnil
-
https://ml314.com/csync.ashx?fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&person_id=5978151496344721696&eid=50052&return=https%3a%2f%2fps.eyeota.net%2fmatch%3fbid%3dr8hrb20%26uid%3dnil
-
https://ps.eyeota.net/match?bid=r8hrb20&uid=nil
|
70 B
171 B
|
11ms
11ms
|
Image
image/gif |
54.93.117.16
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
merge
ce.lijit.com/
Frame E041
|
0
532 B
|
14ms
14ms
|
Image
text/html |
72.251.249.9
Internap Corporation
|
|
|
GET
H/1.1
|
200
OK
|
data
lb24.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.14
HETZNER-AS
|
|
General
- Full URL
- https://lb24.s400.meetrics.net/data?/WWT8LLOBALlnFFLl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A24Ax4A3yA43A3xAyoE3qFjvF0wFy5FuBFUkzF2BPSAAAAAAAAByiXAPAAAFAAyiXTMPsAPAAAJPAWEABMPsAZBAAOA55A55A85B55A58E55A55AFA52A0zA0BErMPsAPgFAJPAWEAHMPsAPkTAAZAwSAcAAAASksFhFjAAAAAAAAAAAAEAAAyiXAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA21AwwAz2AyzAGAkpFylFj0FAAAAJAxzAxxA12A4xA1BEKA1wAw1A43A40Ax4AJAylFj0FhuFnsFlBFKA1wAw1A43A40Ax4AKA1wAw1A43A40Ax4AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAMPsAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFTTT/SA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h216.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
9ms
9ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
/
Show response
onetag-geo.s-onetag.com/
|
23 B
429 B
|
24ms
7ms
|
XHR
application/json |
2600:9000:20bb:2200:5:ae3a:ba00:93a1
Amazon.com
|
|
|