GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
113 KB
44 KB
|
107ms
87ms
|
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
|
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-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
|
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-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
|
11ms
11ms
|
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
|
metaTag.min.daa0a919cde011858b81e921cdd94d2f.js
Show response
js.stroeermediabrands.de/
|
249 KB
60 KB
|
22ms
6ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
27ms
6ms
|
Script
application/javascript |
151.101.114.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.114.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-5cb802ef9b.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
13ms
13ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-fb50956d54.css
www.giga.de/static-local/dist/assets/css/
|
399 KB
53 KB
|
13ms
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
|
29ms
10ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
28ms
22ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
27ms
7ms
|
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/
|
104 KB
37 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
- dce09f5e55feb176dedd208a98b683f1686217e55f0bf701465270347d24c634
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
18 KB
19 KB
|
31ms
11ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.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
- f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
21 KB
21 KB
|
32ms
13ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.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
- 2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
giga.svg
www.giga.de/static-local/dist/assets/images/logos/
|
11 KB
4 KB
|
9ms
8ms
|
Image
image/svg+xml |
178.19.72.10
HGCOMP-ASN
|
|
|
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
5ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
362 B
|
17ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
213 B
|
17ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81b::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-5cb802ef9b.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::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/
|
88 KB
26 KB
|
31ms
18ms
|
Script
application/javascript |
143.204.90.242
Amazon.com
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
9ms
9ms
|
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.09570633703091591
- 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
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&i...
|
0
694 B
|
10ms
10ms
|
Script
application/x-javascript |
91.215.100.40
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=001285e55987b23775dc7bfe2&ep=1600044813&vr=415&id=wapd74&i3=001285e55987b23775dc7bfe2%3A1600242274021%3A1573371874021%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573371874021&n1=3&dntt=0<=1573371874023&ev=&cs=7b0vv7&mo=1&sr=71
- 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
-
91.215.100.40
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de4.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.05.0 0025
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 2A06
|
9 KB
3 KB
|
37ms
20ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
10 KB
10 KB
|
8ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
920 B
|
26ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
58 KB
22 KB
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81b::200e
Google LLC
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
29ms
6ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.2621080548492456
- 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
- b6b69022dbeedf8b91a3a3ea6946be8114306c0042606cae67bea0ef28404f1f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame FF67
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
30ms
30ms
|
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.3,
, 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
securepubads.g.doubleclick.net/tag/js/
|
51 KB
16 KB
|
52ms
40ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
297 KB
92 KB
|
49ms
7ms
|
Script
application/javascript |
13.224.196.46
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
20ms
6ms
|
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
598 B
|
38ms
28ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
-
https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
|
2 KB
2 KB
|
50ms
25ms
|
Script
text/javascript |
2600:9000:21f3:5e00:1f:a1b:34c0:93a1
Amazon.com
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/fdf60e3c-e1b8-428d-828b-8af24a3b50f1/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=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
-
2600:9000:21f3:5e00:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 1662d322e37cf13dc213b2ea4f5ec1ddb3052f91010b9fbe96283dcc4de46465
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
144 B
455 B
|
61ms
8ms
|
Image
image/png |
18.195.39.206
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
27ms
7ms
|
Script
application/javascript |
2600:9000:2156:c600:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
172 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:825::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:825::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
172 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:825::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:825::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_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/
|
223 KB
84 KB
|
29ms
29ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 765c79d7db932953b7c4c409e04a582a7b9f0cad3ebdfee6d5cf3dc5bbb8d1eb
- 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/r20191106/r20190131/
Frame B1DA
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81d::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191106/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:81d::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-c0b8abd8b0.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
9ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-772cc0e021.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
10ms
9ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
10ms
10ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
7 KB
|
20ms
6ms
|
XHR
application/javascript |
143.204.90.242
Amazon.com
|
|
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
8ms
7ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
videojs-ff0ddd6c.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 2A06
|
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 2A06
|
272 KB
92 KB
|
40ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81d::200a
Google LLC
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
54 KB
17 KB
|
54ms
26ms
|
Script
application/javascript |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
7ms
6ms
|
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=1573371874169&__it=-60&__ic=727391&__iq=c9043f73cb045f34fee88b602615d4fd&__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
105 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1479104569&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=565870627&gjid=1373266755&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&z=1576250953
- 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:81b::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 2A06
|
53 KB
15 KB
|
21ms
21ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 2A06
|
1015 B
1 KB
|
22ms
21ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
48ms
16ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 2DB2
|
0
0
|
316ms
315ms
|
Document
text/html |
2a00:1450:4001:81d::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=1459277723&w=468&lmt=1573371874&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&adsid=NT&dt=1573371874130&bpp=8&bdt=152&fdt=60&idt=60&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&correlator=3093041849579&frm=20&pv=2&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=2251851588218866&dssz=55&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031&oid=3&pvsid=107113790445042&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=rQbMRbySiw&p=https%3A//www.giga.de&dtd=72
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 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/
|
78 KB
29 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::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/r20191106/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fc2c078ff7dbfc4334dc543b2fb93107671a69ebdeee982e1f8b866e252ea322
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
7ms
5ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=659803704
- 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:81b::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
96 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=1898361861
- 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:81b::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
102 B
|
8ms
7ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&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=1593725333
- 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:81b::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
96 B
|
9ms
9ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=307124512
- 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:81b::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
96 B
|
9ms
9ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Paypal%20(Android)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1939125127
- 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:81b::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
96 B
|
9ms
8ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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(iOS)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=990166929
- 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:81b::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
96 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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(Windows%20Phone)%20downloaden*&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1849341536
- 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:81b::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
|
pubads_impl_2019103101.js
Show response
securepubads.g.doubleclick.net/gpt/
|
159 KB
58 KB
|
39ms
39ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
fetch_frame_2019103101.html
ff.doubleclick.net/tag/js/
Frame ECC9
|
0
0
|
19ms
6ms
|
Document
text/html |
2a00:1450:4001:81e::2006
Google LLC
|
|
General
- Full URL
- https://ff.doubleclick.net/tag/js/fetch_frame_2019103101.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2006
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 |
|
POST
H2
|
200
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
240 B
|
781ms
6ms
|
XHR
text/plain |
52.29.12.192
Amazon.com
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
98 B
487 B
|
81ms
80ms
|
XHR
text/javascript |
143.204.90.242
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=ZfnwYYD1q3yTA&cb=0&ws=1600x1200&v=7.42.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%2C%22301x601%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.90.242
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-90-242.fra50.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
38ms
25ms
|
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=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=40ca676e-dda8-465a-8d93-673466dadc1b%2C550c8dc1-6b21-4bba-887c-a4e8be6d83e3%2Ccc026f7f-c16a-40c3-b594-bd6a234b92ba&nocache=1573371874306&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%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.167.1 /
- Resource Hash
- 8e82af12eb1ae5cde2f667f9b8542354d8b7ad194664bec310f02a6f760785e2
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
98ms
50ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
101ms
52ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
102ms
53ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
114 B
|
121ms
94ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
901 B
|
102ms
86ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%221386831950bc593%22%2C%22imp%22%3A%5B%7B%22id%22%3A%22142106a02eb474c%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%22151516c565265fa%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2216c684e3e529394%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2217f995be540fe25%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2218e25599ba89b77%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221913583e1130284%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%222079f0dd11fa047%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2221cad80940e1be1%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2222b8982c176143c%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2223dfa2715bc4da%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 603b80da5576a7fd6baa46e63201e4d23d7408ecd9f9a6c80380a49d4c25b27a
|
POST
H2
|
200
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
240 B
|
765ms
7ms
|
XHR
text/plain |
52.29.12.192
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb95.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
13ms
1ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
General
- Full URL
- https://lb95.s400.meetrics.net/bb-mx/submit?/jD1sBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSVCBPAAAAAAAAAOAAAAGAAAAAAAZwSVCBBRksFAQtjF8xZ9SA
- 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.15
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h217.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
12ms
0ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:820::200a
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 2CDB
|
0
0
|
16ms
16ms
|
Document
text/html |
2a00:1450:4001:81d::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573371874&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=1573371874138&bpp=3&bdt=160&fdt=192&idt=192&shv=r20191106&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=3093041849579&frm=20&pv=1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&ga_fc=0&iag=0&icsg=828392537890&dssz=59&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040031&oid=3&pvsid=107113790445042&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=197
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191106/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
delivery.ads.tqR-unHBZhKCE1.gif
www.giga.de/imagex/
|
71 B
474 B
|
34ms
34ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
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
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
5ms
5ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1027592297
- 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:81b::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
|
impl.20191106-19-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
415 KB
117 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
9ms
8ms
|
Script
application/x-javascript |
2.19.43.224
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
13 KB
5 KB
|
331ms
331ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874480&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2257154448&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=62&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 5b750985d245681e7b816c1c69da434ead04cacadd0adc6746c080f8af1275cd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019103101.js
Show response
securepubads.g.doubleclick.net/gpt/
|
64 KB
25 KB
|
39ms
39ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
|
0
0
|
19ms
6ms
|
Other
text/html |
2a00:1450:4001:808::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:808::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
332ms
332ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874490&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2778923653&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 8b82f283e3f518b44dd6050d8dfca59cb318704bed72073384be1140d9a9599d
- 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
|
554ms
553ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874494&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1428895410&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 73419ec87d237765f7eb660f382f3d3c04940c984ad03317084a9e75e3036cb9
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
556ms
556ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=107113790445042&correlator=356948299328295&output=ldjh&impl=fif&adsid=NT&eid=21065107%2C21062452%2C21062889&vrg=2019103101&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191110&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%3D16%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dd15aed7237d248b60bed57f124711de3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1573371874&dt=1573371874497&dlt=1573371873978&idt=466&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858375612&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=63&icsg=3313570151566&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=1630675580.1573371874&ga_sid=1573371874&ga_hid=1479104569&fws=640&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 4206f29e9bd4eebc2ab50230ef824e1b344bdf2e467a84ff2be6aff62ca850dc
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
22ms
8ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:3b
Highwinds Network...
|
|
|
POST
H2
|
200
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
240 B
|
566ms
6ms
|
XHR
text/plain |
52.29.12.192
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
487 B
|
9ms
9ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
25ms
8ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame BE0A
|
0
0
|
33ms
8ms
|
Document
text/html |
52.28.238.200
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=289353145&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.28.238.200
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-28-238-200.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
19ms
16ms
|
Stylesheet
text/css |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
52 KB
13 KB
|
20ms
5ms
|
Script
text/javascript |
151.101.113.194
Fastly
|
|
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 2A06
|
30 KB
30 KB
|
43ms
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.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- 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
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame A16C
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
|
190ms
190ms
|
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
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=1122986495
- 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:81b::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
|
2be29099-93b5-413a-98b2-d34c9db012d6
https://videos.giga.de/
Frame 2A06
|
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 2A06
|
53 B
642 B
|
29ms
10ms
|
XHR
application/json |
52.219.72.195
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 2A06
|
265 B
438 B
|
18ms
18ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
217ms
217ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=08%3A44%3A34.594<i=deflated&data=%7B%22id%22%3A63%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%3A1573371874588%2C%22cv%22%3A%2220191106-19-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%221%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%3A4135%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%3A3452.296875%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.20191106-19-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d25307552c3d68bb4f0ac3bb468ab6f77e3755f64d6a0bb49ac9409dd3c3298b
|
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=1573371874603&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=1573371874603&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 |
2.19.43.224
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573371874603&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
-
2.19.43.224
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-43-224.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 2A06
|
653 B
1 KB
|
780ms
6ms
|
XHR
application/json |
13.224.196.125
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
|
28 KB
11 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.113.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.113.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
2 KB
2 KB
|
56ms
56ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n19=1&n121=2&n116=0&n24=2&n104=0&n15=3&n155=1&n133=1&n106=1&n153=0&n11=1&n120=2&n154=1&n125=0&n8=1&n2=2&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n60=1&n139=0&n160=0&n107=1&n21=1&n40=1&n117=2&n86=1&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=3&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=0&n141=0&n157=0&n99=1&n128=1&n118=5&n85=0&n9=0&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=0&n93=4&n90=1&n43=1&n55=1&n142=0&n7=3&n103=0&n158=1&n124=1&n75=1&n91=0&n114=1&n69=0&n47=1&n10=3&n3=1&n82=1&n84=1&n5=3&n48=1&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=1&n39=1&n156=1&n148=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 2cf2824d7273536f38f615aa482c2a6e8581dee8b688d46c938f6dd987ed91ce
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
10 KB
3 KB
|
34ms
34ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
602 B
|
295ms
270ms
|
XHR
application/json |
184.30.220.71
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=d15aed7237d248b60bed57f124711de3
|
0
495 B
|
25ms
12ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
18ms
18ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
feed-card-placeholder.20191106-19-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.14.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.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20191106-19-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/
Frame D5ED
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
-
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d83fb889-d96d-417d-9470-362dd1e8bf60
|
0
51 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=d83fb889-d96d-417d-9470-362dd1e8bf60
- 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.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame D5ED
|
0
239 B
|
11ms
10ms
|
Image
image/gif |
69.173.144.165
The Rubicon Project
|
|
General
- Full URL
- https://pixel.rubiconproject.com/exchange/sync.php?p=16698
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_GCM
- Server
-
69.173.144.165
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame D5ED
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=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%3D
|
45 B
113 B
|
14ms
14ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=QF8nanX9N_td2YMf25pT3mGEeHVBTdngNee6Uf2zSVI%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.14.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/mediamath-ssp-network/1/
Frame D5ED
Redirect Chain
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439
-
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f0...
|
0
52 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=76a45dc7-b622-4f00-8757-0a5bf245e439&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D76a45dc7-b622-4f00-8757-0a5bf245e439
- 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/pulsepointrtb-network/1/rtb-h/
Frame D5ED
Redirect Chain
-
https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
-
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
|
0
52 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=PN5YqMWiXMVy&ev=1&pid=562107
- 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.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame D5ED
|
43 B
691 B
|
15ms
14ms
|
Image
image/gif |
185.33.223.83
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame D5ED
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=CAESEF9VwtyjN7j89UH4vWrkL1s&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%26goo...
|
0
77 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEF9VwtyjN7j89UH4vWrkL1s&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3DCAESEF9VwtyjN7j89UH4vWrkL1s%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
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame D5ED
|
43 B
691 B
|
28ms
12ms
|
Image
image/gif |
185.33.223.83
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame D5ED
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=05c7807c-99ff-474e-9424-f93057e95431
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e...
|
0
77 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=05c7807c-99ff-474e-9424-f93057e95431&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D05c7807c-99ff-474e-9424-f93057e95431
- 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 D5ED
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=77423821-afe9-440c-9acf-25eefbef82bd&tbid=83092782-89fd-44be-a3dc-11d8c9884945-tuct4c14562&query=taboola_hm%3D77423821-afe9-440c-9a...
|
0
53 B
|
15ms
15ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame D5ED
|
35 B
380 B
|
94ms
94ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame D5ED
|
0
293 B
|
299ms
114ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
sync
x.bidswitch.net/
Frame D5ED
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://odr.mookie1.com/t/v2/sync?tagid=V2_790378&src.visitorId=8372a621-8284-41b1-b96a-1233bf4d2702
-
https://aa.agkn.com/adscores/g.pixel?sid=9212302828&puid=10814409342764586437
-
https://odr.mookie1.com/t/v2?tagid=V2_785409&src.visitorId=266700603235000368849
-
https://x.bidswitch.net/sync?dsp_id=419&user_id=10814409342764586437
|
43 B
213 B
|
9ms
9ms
|
Image
image/gif |
52.58.36.240
Amazon.com
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
96 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1479104569&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=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=1630675580.1573371874&tid=UA-204785-4&_gid=634750232.1573371874&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cm73=1&cm13=1&z=1216638817
- 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:81b::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
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
124 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=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&w=728&h=90
- 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
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 6B17
|
0
76 B
|
17ms
17ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvwIr4bGmvodKqxhJvky8hb22TiuM-D4ZYw66DJ-DaE6tHyPPqS4B0KsX8dEcsL7lIHDCgWiqjAIYCrNP-MnPCfzZjLEv19_m8tE9MzgeiSJCZcr8r93ut6RHDcPmlugit1SuTKuk-uuC4X85wCPoDffZcv2saZ22F34G1eng8DDc9julUKYwCb9JP8tnwSj9wgecYbsref_MdDvZOawBTlcVPmvydtrr0mD38uN-LfE4UCdGiwtzlrZGxm8H-0FPWJU6z2NpM9Nbpvg5DAJonE1vvyNlQD6cyBKPrUHN_S&sig=Cg0ArKJSzEIITM94nvxWEAE&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
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-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
|
mtrcs_220434.js
Show response
s79.mxcdn.net/bb-mx/serve/
Frame 6B17
|
118 KB
46 KB
|
19ms
7ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 6B17
|
77 KB
29 KB
|
17ms
17ms
|
Script
text/javascript |
2a00:1450:4001:81e::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_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
- 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 1A92
|
0
49 B
|
17ms
17ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvk3La_j6yhPayTODHZXORAAXsXb4yKbQcJjiDIN_HL2bTLYE3Jo6f9e9EV1HUrjS-ZEhBeq_QSxOpeUpzxUl-FvR7Me3Q0jxoAOXmVC16WvDh6Ev_S_i1C3nf81db12lf5Z8uQwIJ8fFPdJDpNSkMPZTYCcS3ReNo1n01Naac7Ji93ctD-3Ino9tM9DqSCoyj7nHWEBAjAbOKLw2n42gkj2Oc6FBhFP7n85hpyRu_Lq5eCtIqaIJBFw_Wvb1NTKT2PZT3cngX9ji2zzIYrOuSgWl_TgDA7CLz9ju0-yhrR&sig=Cg0ArKJSzJsFHExFylX0EAE&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
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-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 1A92
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::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_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
261 B
|
15ms
15ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
59 B
|
15ms
13ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
56 B
|
15ms
15ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
60 B
|
16ms
16ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
727 B
|
6ms
5ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_220434.js
Show response
s79.mxcdn.net/bb-mx/serve/
|
118 KB
46 KB
|
6ms
5ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 6B17
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
gettag
Show response
s79.research.de.com/bb-mxad/
|
0
294 B
|
8ms
2ms
|
Script
text/javascript |
188.40.45.203
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
submit
b63.s79.research.de.com/bb-mx/
|
43 B
291 B
|
17ms
1ms
|
Image
image/gif |
78.46.46.82
HETZNER-AS
|
|
General
- Full URL
- https://b63.s79.research.de.com/bb-mx/submit?/wkgsBhAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtxAxtAw0AtxAy6AzwAtyAywA0zA0tAyuAxxAwtAz3A13A1wA4hELlnFB/k0FxBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF9xAy0A31A0wA02A2BEL2wFBLl1FC/2xFXCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgB3pFukFv3FftFznFgjEzzFf3FliFrpF0BFTkzF7FAAAAAAAZwSZVBPAAAAAAAAAOAAAAGAAAAAAAZwSZVBBPBAAAAAAAABemwASksF4BbAAAAAAAAAAAAEAAAemwAAAAAAAIAyzA0xA30A42AJAy1A44A2xA22A4BEHAx0Aw1A5zA2BEMAiyFhuFkiFvvFz0FlyFIA53Aw5A2yA43AHA02AzzAxwAyBEQtjF4eM9TA
- 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
-
78.46.46.82
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h370.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
23ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/551aptz4/182yo/61a80/8tzb4/
|
4 KB
2 KB
|
11ms
10ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
Show response
t.nativendo.de/cds/tracking/event/
|
0
173 B
|
27ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/3a9ab3d0-6c1f-4067-89f5-d604b89f16ee?aid=182yo&floor=M2E5YWIzZDAtNmMxZi00MF8tiIgTaBr7qgf4oQ&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=1573371875
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
- 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
|
37c34ae9-8a53-442e-a7f2-0afcee501031.jpg
c.nativendo.de/cdn/asset/media/crt/52953/2/3/
|
31 KB
31 KB
|
17ms
15ms
|
Image
image/jpeg |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
ai.aspx
m.exactag.com/
|
43 B
655 B
|
48ms
15ms
|
Image
image/gif |
213.202.235.9
MYLOC-AS
|
|
|
GET
H2
|
200
|
1x1.gif
cdn.exactag.com/
|
799 B
1 KB
|
34ms
6ms
|
Image
image/gif |
185.59.220.19
CDN77
|
|
|
GET
H2
|
200
|
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
Show response
t.nativendo.de/cds/tracking/event/
|
0
171 B
|
15ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 0910
|
0
58 B
|
17ms
16ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssHeN_3NkmHSdKQBS-drZb8y_9R7LzbuljG3pGdXq58DJKcsX6Tk0AOeuel88bST3eN64lfIVfD0cF1Dk_jE7yys1x2qH0-B1P96Z-HO0OJVBNUjeDsENLTILDot_c-fLp-pzzPAMt_0xRju11BwDYHGw49dco_JRYTWXguaIA4lvSWNP77Ur0CN8wHnjDH5wuKe_8boDIKzNgj1CwoxvCZvS0_wnAbQ-U2CTW5iri_HozHvkh1y4NC0vTs2ohcNHD6NJASvxt6UApvpw9MaiR-CrTHTRD2d3egJbnEJ6Rimgf1OiPDcug1pD4&sig=Cg0ArKJSzPBZzraxNkXxEAE&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
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-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
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/
Frame 0910
|
197 KB
67 KB
|
74ms
36ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0910
|
77 KB
29 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::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_2019103101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 66557b1fd9e362afdfa527946d2f7702a2edd34c87797cfd6dfe2d9916d2af6b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame CFE6
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvBWsVqj0CYgS_6RgxlNhfOvyvUQmGQ1SiA1Si64DlcSDOytNfOxfjwQDxaoMoXBNuw-2_jFxcmL8flhqtEZTQ79zGLxzymF7qrqz7EnUHFxWy99hCCW5dYlmNUNTJxRzvkIoOgP2K20...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
344 B
|
29ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
95 B
364 B
|
8ms
8ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame 7928
|
0
0
|
24ms
24ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
General
- Full URL
- https://lb95.s400.meetrics.net/data?/jD1sDdMAAKktFLkqFFlqwF23A52AwwA/k0FDEmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0BELlnFBUkzFnBPhJAAAAAAAB9gOAPBAAFAA9gOTA5iAPAAAlEA5BABA5iAZBAAOA55A55A85B55A58E55A55AFA15A01AzBErA5iAP3AAlEA5BAHA5iASksFJFjAAAAAAAAAAAAEAAA9gOAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA5yA22Aw1A50AGAkpFylFj0FAAAAIAy4Ay2A52A11AKA1yAw4A43A50A5wAGAihFuuFlyFKA1yAw4A43A50A5wAKA1yAw4A43A50A5wAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdlEA5BAoPAAAAFAAAA5iAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFAObBUA
- 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.15
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h217.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
3a9ab3d0-6c1f-4067-89f5-d604b89f16ee
Show response
t.nativendo.de/cds/tracking/event/
|
0
171 B
|
14ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame 0910
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-l...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
16ms
13ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame 73B3
|
81 KB
20 KB
|
71ms
23ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
264ms
86ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyizPF,pingTime:-2,time:55,type:a,im:{sf:0,pom:1,prf:{mdA:2,mdZ:89,beA:92,beZ:93,mfA:94,cmA:95,inA:95,inZ:99,prA:99,prZ:105,si:110,poA:111,poZ:115,cmZ:115,mfZ:115,loA:124,loZ:125,ltA:146,ltZ:146}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:55,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[50~100],as:[50~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_2,google_ads_iframe_4444/giga.de_sd/software_artikel_2__container__,sdgAdServerContainer-rectangle,rectangle-3],sinceFw:35,readyFired:true}&br=u
- 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
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
DATA
|
200
OK
|
truncated
/
Frame 0910
|
210 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
General
- Full URL
- https://lb95.s400.meetrics.net/data?/jD1sEJOAA/k0FTImvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0mEvyFthF0jFvkFl9B4tB1uFruFv3FutBx4ExmAhkF29By4A23A51A31AmjEwpFk9BklFzrF0vFwmBhwFh9B00A4yAz4A4yA5yAmjEpkF9xAz4AyxA2yA01Az3AymAzpF6lF9xA4xBmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9Bv1F0tBvmFtwEhnFlmBhwFj9B00A4yAz4A4yA5yAmhEwkF90A04AyzA44Ay5AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AxxAyBELlnFCUkzFYBPDCAAAAAAABipHAPAAAFAAipHThRjAPAAAAAAkaABhRjAZAAAOA55A55A85B55A58E55A55AFAzxAzzAwBErhRjASksFhFjAAAAAAAAAAAAEAAAipHAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAKAHvFvnFslFgBEkYFAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAkaAAAAAAAFAAAhRjAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFscrKWA
- 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.15
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h217.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
General
- Full URL
- https://lb95.s400.meetrics.net/data?/jD1sFKOAA/k0FhMmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA44A35A05AwmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AywA44A35A05AwmAhwFk9B1yAw4A43A50A5wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A30A5yA0mEvyFthF0jFvkFl9B4tB1uFruFv3FutBx4ExmAhkF29By4A23A51A31AmjEwpFk9BklFzrF0vFwmBhwFh9B00A4yAz4A4yA5yAmjEpkF9xAz4AyxA2yA01Az3AymAzpF6lF9xA4xBmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9Bv1F0tBvmFtwEhnFlmBhwFj9B00A4yAz4A4yA5yAmhEwkF90A04AyzA44Ay5AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlmBhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AxxAymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zAz3Ax4A31AyxA5BELlnFDTkzFtPrBAAAAAAABDWmAPAAAFAADWmTbosAPAAAJPAWEABbosASksFeFjAAAAAAAAAAAAEAAADWmAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yAJAylFj0FhuFnsFlBFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFGA31YA
- 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.15
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h217.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 2A06
|
191 KB
56 KB
|
9ms
9ms
|
XHR
application/javascript |
13.224.196.125
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
data
b63.s79.research.de.com/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
78.46.46.82
HETZNER-AS
|
|
General
- Full URL
- https://b63.s79.research.de.com/data?/wkgsCPHAALktFBLkqFFlqwFyyAw0Az0ATkzFPPLHAAAAAAAz3VGASksFeCd/EA+GAUHA8AAAAAA3VGAAAPAOPFfTFPVFSDFFfF20A22AzBECACBFAAAAAAAAAAAAAAGAJGFSBFNFFdJPAWEAsEA6DAAAAAJI2AAAQAOPFfTFPVFSDFFfFxxA01A22ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFrEiTSA
- 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
-
78.46.46.82
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h370.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
b63.s79.research.de.com/
|
43 B
308 B
|
2ms
0ms
|
Image
image/gif |
78.46.46.82
HETZNER-AS
|
|
General
- Full URL
- https://b63.s79.research.de.com/data?/wkgsDQHAATkzFASksFUXd/EA+GAUHA8AAAAAAF8FAAA+Oo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtzA5zA54AxzAy4A3wAzwAw4A0mAv1F0wF10F9oE0tFsmBo9B2wAmzEsvF0uFhtFl9Bz4A31Aw2A05A13AmhEkrF9yAyxAwzA00A2wA4mAhkFm9Bx0A15Ay3A33AyzAm3E90A24AmsEt0F9xA13AzzA3xA43A0mAn1FjpF9xAuyAuwAuwAuyAuyAuwAuwAmmEvyFthF09B02A44E2wAm1EysF9oE00FwzFlzABlByGElyAG3F33FunEpnFhuBklFlyAG3FliFhwFwzFlyAGwFh5FwhFslByGE0pFwwFzlByGEwhF5wFhsFtsEvnFpuFtzEvtBnlFo0FztB1uFktBzvFtsEvlFz0FtpEoyFtsEvnFpuFtwEyvFisFltFllByGEmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA13AzzA3xA43A0xAzwAmiEwwF94AmiEk0F9xA1yAmmEk0F92AwmApkF09B2wAmzEo2F9yEywAx5AxxAw2AmjEi2F9yEywAx5AwxAzxAmzEhsFkyF9hEhmBhiF4lF9xAmjEvyFylFshF0vFy9BzwA5zAw0Ax4A05A13A5mAmyFt9BywAmwE29BymAnhFf2FpkF9xA2zAw2A31A14AwuAx1A3zAz3Ax4A30AmnEhfFzpFk9Bx1A3zAz3Ax4A30AmnEhfFopFk9Bx0A35AxwA01A25AmnEhfFmjF9wAmpEhnF9wAmpEjzFn9ByyA1xA41Ax1A44AyxA44A22AmkEzzF69B11AmtEkvF9wAmtEzvF9wAm1Ef0F69B2wAm1EfoFpzF9yAm1EfqFh2Fh9BwmA1fFo9BxyAwwAm1Ef3F9xA2wAwmA1fFhoF9xAywAwmA1fFh3F9xA2wAwmA1fFjkF9yA0mA1fFuwFs1Fn9BwmA1fFutFptFl9BwmAhkF49BzxA4mAhkF59B00A2mAipF39Bx1A41AmiEpoF9xAywAwmAzjFyfF49BwmAzjFyfF59BwmAlpFk9BywAw0AwwAzxAmvEpkF9zAmwE2zFpkF9xAw3AxxAz3A5wA00A1wA0yAmyE49BwmAlhFl9BwmAmjF94A52AmiEykFptF9wAlyADwBlyADwBlyADwBlyADxB2wAwlAyDEwlAyDEx2AwwAlyADxBywAwlAyDEx2AwwAlyADxBywAwmA2pFz9BxmAyzF69Bl3ADlB3DElFFl3ADmBhiFs9BDTFmwEm4F9wAmmE19Bx2AmiEj9BzxAmpEmpF9xAm1EjpF9hEhxAmmEziF9xAm4EwjF9yERiFNSFi5FTpF3mBw9Bo0F0wFzlBzBEvvA33F3uBnpFnhFukElmBk0Fk9B3yACACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjF6sw+XA
- 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
-
78.46.46.82
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h370.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
b63.s79.research.de.com/
|
43 B
308 B
|
2ms
0ms
|
Image
image/gif |
78.46.46.82
HETZNER-AS
|
|
General
- Full URL
- https://b63.s79.research.de.com/data?/wkgsEQHAA/k0FxBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF9xAy0A31A0wA02A2BElqwFyyAw0Az0ALkmFBTkzFARksFAQtjFwIYUSA
- 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
-
78.46.46.82
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h370.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 2A06
|
191 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
90 B
467 B
|
19ms
18ms
|
Script
text/javascript |
37.157.6.245
ADFORM
|
|
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
827 B
|
113ms
31ms
|
Script
application/javascript |
52.214.103.10
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
18 KB
18 KB
|
654ms
648ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
POST
H2
|
204
|
ngx_pagespeed_beacon
Show response
www.giga.de/
|
0
73 B
|
7ms
7ms
|
XHR
text/plain |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/ngx_pagespeed_beacon?url=http%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_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
85ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyizUV,pingTime:-10,time:381,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83OC4wLjM5MDQuNzAgU2FmYXJpLzUzNy4zNnx8MXx8MXx8R29vZ2xlIEluYy58fG4-,asp:1573371875524||c40640bb00e64d954b56fefd57ca5a46||2843f8c0b82761982424c93233cd1ed5||8d39a2cdc1a80181be1bdc1f1f60d9b6||da63e48fd7138d4a8ece05fda5c62ca0||a636563c233984b453116f7b21a67e5a||9a2b39da10502651e7f3d5f4bcecc7a8||d73d6c03ff56f77156641e764805d12c||1529428597}
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
6ms
5ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
40ms
9ms
|
Script
application/javascript |
89.163.159.109
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
91ms
21ms
|
Script
application/javascript |
62.168.44.118
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
94ms
30ms
|
Script
text/javascript |
54.77.22.22
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
531 B
|
29ms
15ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
|
match
pixel.consentric.de/tp/
|
43 B
354 B
|
53ms
13ms
|
Image
image/gif |
62.138.221.190
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
2ms
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&_=1573371875534.-1250082532
- 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
|
monitoring.js
Show response
cdn.prod.pubstack.io/
|
61 KB
19 KB
|
20ms
6ms
|
XHR
application/javascript |
34.95.76.218
Google LLC
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
127 B
|
35ms
10ms
|
Script
text/plain |
89.163.159.121
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.121
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
24ms
9ms
|
Script
application/javascript |
2600:9000:21f3:d400:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
63 KB
20 KB
|
28ms
7ms
|
Script
application/javascript |
143.204.101.24
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
31ms
31ms
|
Script
text/javascript |
54.77.22.22
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%2F78.0.3904.70%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=d15aed7237d248b60bed57f124711de3&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=35525905206
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.77.22.22
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- dd0ed2aa79b978b0c5e0cf9cdedcd3271deadfdd80a7f1cf4f53ed27be199a03
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
129ms
30ms
|
Script
application/javascript |
63.34.92.224
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 2755
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsBFBSJFWSRAWsUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4209144157264917545
|
42 B
665 B
|
37ms
30ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame E88F
|
0
0
|
123ms
30ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
|
GET
H2
|
200
|
5198271552
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
249 B
|
32ms
9ms
|
XHR
application/json |
52.29.86.7
Amazon.com
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
58 B
|
28ms
27ms
|
XHR
text/plain |
54.171.34.13
Amazon.com
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
58 B
|
28ms
28ms
|
XHR
text/plain |
54.171.34.13
Amazon.com
|
|
|
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 2A06
|
53 B
642 B
|
13ms
12ms
|
XHR
application/json |
52.219.72.195
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=4035595654
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.72.195
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 2A06
|
265 B
438 B
|
7ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=6477344309
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- 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
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 2A06
|
653 B
1 KB
|
6ms
6ms
|
XHR
application/json |
13.224.196.125
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7693458786
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.196.125
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-196-125.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/578eeaadc08deea6da5df97460114e34bf2bf3cb/
Frame 2A06
|
653 B
1 KB
|
97ms
61ms
|
XHR
application/json |
46.4.116.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/578eeaadc08deea6da5df97460114e34bf2bf3cb/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.116.20
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.20.116.4.46.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 2A06
|
24 B
409 B
|
1412ms
1ms
|
XHR
application/octet-stream |
148.251.51.163
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,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame C8B6
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
85ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiA68,pingTime:1,time:1076,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1076,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1071~100],as:[1071~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:89,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
171ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiA69,pingTime:1,time:1077,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1077,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1072~100],as:[1072~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:89,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
665 B
|
30ms
30ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 0910
|
42 B
111 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsubBe6l9JqseGdtZ_r9FkmvBUeJ8VjrgViLtnPvehMIEI8EQEFt3LU2JSWVwqVdyqYbN1ea_ndxSMwG6PaY7RahGKHXHcp45e8mieaixF4&sig=Cg0ArKJSzC5_eHq56jW3EAE&adk=1428895410&tt=748&bs=1585%2C1200&mtos=1018,1018,1018,1018,1018&tos=1018,0,0,0,0&p=278,968,528,1268&mcvt=1018&rs=3&ht=0&tfs=908&tls=1926&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=662&niot_cbk=671&md=2&lm=2&rst=1573371875055&rpt=166&isd=0&msd=0&imams=1&oseid=3&xdi=0&ps=1585%2C5721&ss=1600%2C1200&pt=1182&bin=1&deb=1-2-6-26-19-13-110-17-0-0-0&tvt=1924&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191108
- 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 |
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/62245006fcfec6556acff90f15be4dd5979adf5a/
Frame 2A06
|
109 B
671 B
|
20ms
3ms
|
XHR
application/json |
46.4.116.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/62245006fcfec6556acff90f15be4dd5979adf5a/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFdhZW5naWVyb05vb2Rvb3Q9V2FlbmdpZXJvTm9vZG9vdHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVmV8fCh4LlZlPTApO3guVmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5WZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7Zi5aYShiLGEsW10sYyxjLGwpfSl9bC5nKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bS5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZi5FaylmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay53YyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgpmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLlJhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuamYoYyk7Yi52bihsKTtiLnVuKG0pO2Iuam4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGEpe2MucGF1c2UoKTtpZihsLkpiLmxlbmd0aCl7dmFyIGI9bC5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBkO2Q9Zi5Ebih7IltMT0FEU0NSSVBUXSI6Zi5XKDEwKSwiW1VUSUxTXSI6Zi5XKDEwKSwiW0NBTExCQUNLXSI6Zi5XKDEwKX0pO3dpbmRvd1tkWyJbTE9BRFNDUklQVF0iXV09Zi5qaC5iaW5kKGYpO3dpbmRvd1tkWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tkWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZCBpbiBiKW1bZF09YltkXTtyKGMsYSl9O2Q9Yi5zY3JpcHRzLnNoaWZ0KCk7KWYuamgoZCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgaGE9Yy52anx8aGE7bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRWs9ITE7dGhpcy5DYj0ic2V0dXAiO3RoaXMuT2M9W107dGhpcy5wZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLldtLmJpbmQodGhpcykpO3RoaXMubmI9e307dGhpcy5TZz17fTt0aGlzLmZmPSExfWMuWWk9YTthLnByb3RvdHlwZT17VW46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMubmJbYV0rIl8iKTtyZXR1cm4gYn0sV2I6ZnVuY3Rpb24oKXt0aGlzLmZmfHwodGhpcy5mZj1mLlcoMTApKTtyZXR1cm4gdGhpcy5mZn0sb2I6ZnVuY3Rpb24oYil7dGhpcy5uYltiXXx8KHRoaXMubmJbYl09MCk7dGhpcy5uYltiXSs9MTs1PHRoaXMubmJbYl0mJiF0aGlzLlNnW2JdJiYodGhpcy5TZ1tiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlVuKCksITApKX0scGU6ZnVuY3Rpb24oKXt0aGlzLlg9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx2azpmdW5jdGlvbihiKXt0aGlzLlguZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZSl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZSl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmV9KX0sV206ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuVm0oYi5kYXRhKX0sVm06ZnVuY3Rpb24oYil7aWYodGhpcy5YJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5YLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGU9MDtlPGE7ZSsrKXRoaXMuWCYmdGhpcy5YLmV2ZW50bGlzdGVuZXImJnRoaXMuWC5ldmVudGxpc3RlbmVyW2VdJiZiLmV2ZW50PT10aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5uYW1lJiZ0aGlzLlguZXZlbnRsaXN0ZW5lcltlXS5jYihiKX0saWU6ZnVuY3Rpb24oYixhKXt0aGlzLlguZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxwZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5IZyhiKSxlPSExO2lmKGEpcmV0dXJuIHRoaXMudmQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxlfSxIZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx0azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihmLnBsKGIpKXJldHVybjsoYT10aGlzLnBnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5YLnVybHNbYl09YTt0aGlzLlgudXJsc1thXT1iO3RoaXMuWC5ob21hZFVybHNbYl09YTt0aGlzLlgub3JpZ2luYWxVcmxzW2FdPWJ9fSxwbDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlguaG9tYWRVcmxzW2JdJiYoYT10aGlzLlguaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5YLm9yaWdpbmFsVXJscyYmdGhpcy5YLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5YLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LG9tOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LHllOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZT0iIjtmb3IoZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJgphKys7cmV0dXJuIGF9LEdnOmZ1bmN0aW9uKGIsYSl7dmFyIGU9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOiJmdW5jdGlvbiI9PT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKCkpOiJvYmplY3QiPT09dHlwZW9mIGU/ZTpudWxsfSxGbjpmdW5jdGlvbihiLGEsZSl7YiYmKGIuc3R5bGVbYV09ZSl9LGxmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPXRoaXMuJGsoYSksZz0wO2c8ZS5sZW5ndGg7ZysrKXRoaXMuRm4oYixlW2ddLmtleSxlW2ddLnZhbHVlKX0sR2s6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LCRrOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxlPXt9LGc9ZT0iIixuPTA7bjxiLmxlbmd0aDtuKyspe3ZhciBjPWJbbl0uc3BsaXQoIjoiKSwKZT1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zz1jWzFdLnRyaW0oKTpnPSIiO2UuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCItIikmJihjPWUuc3BsaXQoIi0iKSxlPWNbMF0rdGhpcy5HayhjWzFdKSk7ZT17a2V5OmUsdmFsdWU6Z307YS5wdXNoKGUpfXJldHVybiBhfSxxZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxGZTpmdW5jdGlvbihiLGEpe3ZhciBlPTAsZz0wLG49MCxjPTAsZj0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7bj1oLmhlaWdodCpoLndpZHRoO2U9aC53aWR0aDtnPWguaGVpZ2h0OzA+aC50b3AmJihnKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihnLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihlKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZS09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmcmJihnPTApOzA+ZSYmKGU9MCk7MDxuJiYoYz0xMDAvbiplKmcpO2M+PWEmJihmPSEwKTtyZXR1cm4gZn0sR2U6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5GZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShiKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxXOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixlPTA7ZTxiO2UrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sQWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGc7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZz1iLmNoYXJDb2RlQXQoZSksYT0oYTw8NSktYStnLGF8PTA7cmV0dXJuIGF9LEpoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGQ9IiIsZSxnO2ZvcihlPTc7MDw9ZTtlLS0pZz1iPj4+NCplJjE1LGQrPWcudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGUoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZyxuLGM9QXJyYXkoODApLGY9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLGw9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxwLHksdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO3A9Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGc9MDtnPHAtMztnKz00KW49Yi5jaGFyQ29kZUF0KGcpPDwyNHxiLmNoYXJDb2RlQXQoZysxKTw8MTZ8Yi5jaGFyQ29kZUF0KGcrMik8PDh8Yi5jaGFyQ29kZUF0KGcrMykscS5wdXNoKG4pO3N3aXRjaChwJTQpe2Nhc2UgMDpnPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmc9Yi5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmc9Yi5jaGFyQ29kZUF0KHAtMik8PDI0fGIuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zz1iLmNoYXJDb2RlQXQocC0zKTw8MjR8Yi5jaGFyQ29kZUF0KHAtMik8PDE2fGIuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGcpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGc9MDsxNj5nO2crKyljW2ddPXFbYisKZ107Zm9yKGc9MTY7Nzk+PWc7ZysrKWNbZ109ZShjW2ctM11eY1tnLThdXmNbZy0xNF1eY1tnLTE2XSwxKTtuPWY7cD1oO3k9azt1PWw7cj1tO2ZvcihnPTA7MTk+PWc7ZysrKXQ9ZShuLDUpKyhwJnl8fnAmdSkrcitjW2ddKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2ZvcihnPTIwOzM5Pj1nO2crKyl0PWUobiw1KSsocF55XnUpK3IrY1tnXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9eSx5PWUocCwzMCkscD1uLG49dDtmb3IoZz00MDs1OT49ZztnKyspdD1lKG4sNSkrKHAmeXxwJnV8eSZ1KStyK2NbZ10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1lKHAsMzApLHA9bixuPXQ7Zm9yKGc9NjA7Nzk+PWc7ZysrKXQ9ZShuLDUpKyhwXnledSkrcitjW2ddKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT15LHk9ZShwLDMwKSxwPW4sbj10O2Y9ZituJjQyOTQ5NjcyOTU7aD1oK3AmNDI5NDk2NzI5NTtrPWsreSY0Mjk0OTY3Mjk1OwpsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZikrYShoKSthKGspK2EobCkrYShtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGUsZyxuLGMsZixoLGs9MDtrPGIubGVuZ3RoOyllPWIuY2hhckNvZGVBdChrKyspLGc9Yi5jaGFyQ29kZUF0KGsrKyksbj1iLmNoYXJDb2RlQXQoaysrKSxjPWU+PjIsZT0oZSYzKTw8NHxnPj40LGY9KGcmMTUpPDwyfG4+PjYsaD1uJjYzLGlzTmFOKGcpP2Y9aD02NDppc05hTihuKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGptOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGU9ITEsZz0hMSxuPSExLGM9ITEsZj0hMSxoPSExLGs9ITEsbD0hMSxtPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZT0hMCl9Y2F0Y2gocil7fXRyeXtnPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlJiPyEwOiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLApmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLG09KGx8fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZTtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPW47Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWY7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPWw7Yi5pc0JsaW5rPW07cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e3hpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEVpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApWbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx3ajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxjazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sbGo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxNajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEJrOmZ1bmN0aW9uKCl7cmV0dXJuIGIueGkoKXx8Yi5FaSgpfHxiLlZsKCl8fGIud2ooKXx8Yi5jaygpfHxiLmxqKCl8fGIuTWooKX19O3JldHVybiBudWxsIT1iLkJrKCl9LHVsOmZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudCxhLGU9Yi5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZVsxXSkpcmV0dXJuIGE9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhiKXx8W10sIklFICIrKGFbMV18fCIiKTtpZigiQ2hyb21lIj09PWVbMV0mJihhPWIubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1hKSlyZXR1cm4gYS5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtlPWVbMl0/W2VbMV0sZVsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShhPWIubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZS5zcGxpY2UoMSwxLGFbMV0pO3JldHVybiBlLmpvaW4oIiIpfSxzYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZT17fSxnPTE0O2ctLTspZVthW2ddXT1iW2ddfHwiIjtlLnF1ZXJ5S2V5PXt9O2VbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxkKXthJiYoZS5xdWVyeUtleVthXT1kKX0pO3JldHVybiBlfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGU9W10sZz0wLG49Yi5sZW5ndGg7ZzxuOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZS5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGV9LFhiOmZ1bmN0aW9uKGIpe2I9dGhpcy5zYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFk6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZT0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihlPSEwKTtyZXR1cm4gZX0sSWw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGU9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGU9dGhpcy5zYShkb2N1bWVudC5yZWZlcnJlciksYj1lLmhvc3QsYT1lLnBhdGgpfXJldHVybiBiK2F9LGRsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBlPVtdLGc9W10sbj0wO248YS5sZW5ndGg7bisrKWVbYVtuXV09ITA7Zm9yKG49MDtuPGIubGVuZ3RoO24rKyllW2Jbbl1dfHxnLnB1c2goYltuXSk7cmV0dXJuIGd9LExuOmZ1bmN0aW9uKGIsYSl7dmFyIGU9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxlPWEvMTAwKmcpOihlPWIuc3BsaXQoIjoiKSwKZT0zNjAwKitlWzBdKzYwKitlWzFdKyArZVsyXSxlPU1hdGgucm91bmQoZSkpfWNhdGNoKG4pe2U9LTF9cmV0dXJuIGlzTmFOKGUpPy0xOmV9LENnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5iaShhKSsiOiIrdGhpcy5iaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sYmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LGhmOmZ1bmN0aW9uKGIpe3RoaXMuQ2I9Yn0semc6ZnVuY3Rpb24oYixhLGUpe3ZhciBnO2Uuc3RhdGU9dGhpcy5DYjt0aGlzLmZlKGUpOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2c9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDplfSk6KGc9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxlKSk7CmIuZGlzcGF0Y2hFdmVudChnKX0semM6ZnVuY3Rpb24oYixhLGUpe2F8fChhPSJoZEV2ZW50Iik7ZXx8KGU9d2luZG93KTt0aGlzLnpnKGUsYSxiKX0sbzpmdW5jdGlvbihiLGEsZSxnLG4sYyxoKXt2YXIgQj1iO2UmJmEmJihhPWsuUWEoYSxlKSk7YSYmKEI9ay5RYShiLGEpKTtnJiYoQj1rLlFhKEIsZykpO24mJihCPWsuUWEoQixuKSk7YyYmKEI9ay5RYShCLGMpKTtoJiYoQj1rLlFhKEIsYykpO2YuemMoQil9LFltOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2lmKCFiLmNvZGUpcmV0dXJuITE7aWYoYi5zcGVjaWFsX3RyYWNrKWE9YjtlbHNlIGlmKCEoYi5jb2RlJiYxMDA1PD1iLmNvZGUmJjEwMjk+PWIuY29kZSl8fDEwMjM9PWIuY29kZXx8MTAxOD09Yi5jb2RlKXJldHVybjt0cnl7aWEmJihhLnNlc3Npb25faWQ9aWEpO2EuYWRzZXNzaW9uX2lkPWIuYWRzZXNzaW9uX2lkP2IuYWRzZXNzaW9uX2lkOiJlcG9uIjtiLmhvbWFkSW1wcmVzc2lvbkFkSWQmJihhLmFkX2lkPWIuaG9tYWRJbXByZXNzaW9uQWRJZCk7CmEuZXZlbnQ9Yi5jb2RlO2Euc2l0ZV9ocmVmPXRoaXMuSWwoKTtpZihiLnN0YXRlKXN3aXRjaChiLnN0YXRlKXtjYXNlICJwcmVyb2xsIjphLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6YS5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjphLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDphLnBvc2l0aW9uPTB9Yi52aWRlb19kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249Yi52aWRlb19kdXJhdGlvbil9Y2F0Y2goZSl7fXJldHVybiBhfSxNbjpmdW5jdGlvbihiKXtiLnNwZWNpYWxfdHJhY2s9ITA7Yi5zZXNzaW9uX2lkPXRoaXMuV2IoKTtiLmV2ZW50X2NvZGV8fChiLmV2ZW50X2NvZGU9OTk5MDApO2IuY29kZT1iLmV2ZW50X2NvZGU7Yi5ldmVudF9uYW1lfHwoYi5ldmVudF9uYW1lPSJub25hbWUiKTt0aGlzLmZlKGIpfSxmZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlltKGIpO2lmKGEpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZlKGEpfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChlKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO2I9bC5LYygpO2wud2EoYiwhMCk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2IuZGF0YS5ob21hZF9hdD1hO2wuSGEoYixmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYixhLGUpe2lmKGUpaWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGIsYSxlKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO2EmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBnPWwuS2MoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpOwpsLndhKGcsITApO2c9bC53YShnLCEwKTtnLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtnLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO2cuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtsLkhhKGcsZnVuY3Rpb24oZSl7dmFyIGc9ITE7ZT1lLnJlc3BvbnNlVGV4dDt0cnl7ZT1KU09OLnBhcnNlKGUpLGU9ZS5kYXRhLGVbMF09PWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGc9ITApLGVbMV0mJmVbMV0hPWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGc9ITEpfWNhdGNoKGMpe31nfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZVswXT9lWzBdOiIiKSsoZVsxXT9lWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sTmQ6ZnVuY3Rpb24oYil7aWYoIWx8fCFsLlIpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGtleSxhLGZvcmNlVHJhY2spfS5iaW5kKHRoaXMpLAo1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe3ZhciBhPWIuam9pbigiLCIpO2I9bC5LYygpKyI/aG9tYWRfdHJhY2s9IitlbmNvZGVVUklDb21wb25lbnQoYSk7Yj1sLndhKGIsITApO2IuZGF0YS5ob21hZF90cmFjaz1hO2wuSGEoYil9fSxNZTpmdW5jdGlvbigpe2wmJmwuUj9sLmlzRW5hYmxlZCYmbC5MaygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHdlOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGImJiJvYmplY3QiPT10eXBlb2YgYiYmYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKS5sZW5ndGg/dGhpcy5rYihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpWzBdKToiIn0semU6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuY2hpbGROb2RlcyYmYi5jaGlsZE5vZGVzWzBdP2IuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucGQoYik6IiJ9LHBkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuemUoYik7CmEmJihhPWEudHJpbSgpKTshYSYmYi50ZXh0Q29udGVudCYmKGE9Yi50ZXh0Q29udGVudCxhPWEudHJpbSgpKTtyZXR1cm4gYX0sY2c6ZnVuY3Rpb24oYixhLGUsZyl7ZT0hMTtpZihhLkhlKGIpfHx0aGlzLm9tKGIpfHwwPD1iLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYjt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guZWYmJndpbmRvdy5zYW5kYm94LmVmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoImVycm9yIil8fHNhbmRib3guZWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYikoIkVycm9yIikpO2lmKHRoaXMueGcoYikpcmV0dXJuIHRoaXMueGcoYik7dmFyIG49e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07bi5ob21hZF91cmxfc3VmZml4PWI7bi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGIpO24uaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPQoidHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2cmJmcucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZSYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZyYmZy5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZT0hMTtlPXRoaXMuWmEoYixhLkdhLG4sZnVuY3Rpb24oYil7Yz1iLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGEsITApO3RyeXtjfHwoYz1lKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZil7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1hLnNkKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLnRrKGMsYik7cmV0dXJuIGN9LFphOmZ1bmN0aW9uKGIsYSxlLGcsYyxmLGgsayl7dmFyIEU9Znx8bDtmPSEwO2smJihmPSExKTtpZihFJiZFLlIpaWYoRS5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PQp0eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGIpYygpO2Vsc2V7RS53YShiLGYpO2Y9RS53YShiLGYpO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWE7Zi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGUpZi5kYXRhW3JdPWVbcl07cmV0dXJuIEUuSGEoZixnLGMsIiIsIiIsaCl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGIsYSxlLGcsYyxFLGgsayl9LmJpbmQodGhpcyksNTAwKX0sdmQ6ZnVuY3Rpb24oYixhLGUsZyxjLGYsaCl7dmFyIGs9ITA7aCYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZSl7aD1lO2U9IiI7Zm9yKHZhciBsIGluIGgpZSs9IiYiK2wrIj0iK2VuY29kZVVSSUNvbXBvbmVudChoW2xdKTtlPWUuc3Vic3RyKDEpfXZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHwKNCE9bS5yZWFkeVN0YXRlfHwyMDAhPW0uc3RhdHVzJiYyMDEhPW0uc3RhdHVzfHxnKG0pO2MmJjQ9PW0ucmVhZHlTdGF0ZSYmMjAwIT1tLnN0YXR1cyYmMjAxIT1tLnN0YXR1cyYmYyhtKX07dHJ5e20ub3BlbihhLGIsayksbS53aXRoQ3JlZGVudGlhbHM9ZiwwPGUubGVuZ3RoJiZtLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLG0uc2VuZChlKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIG19LHdtOmZ1bmN0aW9uKGIsYSxlKXt0aGlzLnZkKGIsIkdFVCIsIiIsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWI9Yi5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGIpO2UmJgooYy5vbmVycm9yPWUpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTthJiZzZXRUaW1lb3V0KGEsMCl9LmJpbmQodGhpcyksZSl9LGpoOmZ1bmN0aW9uKGIsYSxlLGcpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYixnLkdhLGMsZnVuY3Rpb24oYil7Yj1iLnJlc3BvbnNlVGV4dDt0cnl7Yj1KU09OLnBhcnNlKGIpfWNhdGNoKGMpe2I9ITF9dGhpcy53bShnLnNkKCkucmVwbGFjZSgiW2hhc2hdIixiLmhhc2gpLGEsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGcsITApfSwKRG46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuT2M9Yn0sVG86ZnVuY3Rpb24oYixhLGUsZyxjKXt0aGlzLlphKGIsZSx7fSxmdW5jdGlvbihiKXt0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7ZVswXSYmKGU9ZVswXSk7ZT9lLmlkPyhhPWEucmVwbGFjZSgiW2lkXSIsZS5pZCksYT1hLnJlcGxhY2UoIltwcmljZV0iLGUucHJpY2UpLGE9YS5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGUuYWR2ZXJ0aXNlciksYT1hLnJlcGxhY2UoIltjdXJsXSIsZS5jdXJsKSxhPWEucmVwbGFjZSgiW2Zvcm1hdF0iLGUuZm9ybWF0KSxhPWEucmVwbGFjZSgiW3NyY10iLGUuc3JjKSxhPWEucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixlLnByaWNlcmFuZ2UpLGE9YS5yZXBsYWNlKCJbcGlkXSIsZS5waWQpLGE9YS5yZXBsYWNlKCJbcHJpb10iLGUucHJpbyksYT1hLnJlcGxhY2UoIltkaWRdIixlLmRpZCksYyh7cGxhY2Vob2xkZXI6YSxtYWNybzpnfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfWNhdGNoKGYpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pfSl9LENrOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0hMTshYTspe3ZhciBlPWIubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmU/YT0hMDooZT1iLnN1YnN0cmluZyhlKzcsYi5pbmRleE9mKCIpIixlKSksYj1iLnJlcGxhY2UoIkVOQ09ERSgiK2UrIikiLGVuY29kZVVSSUNvbXBvbmVudChlKSkpfXJldHVybiBifSxobTpmdW5jdGlvbihiLGEpe3ZhciBlPSExO2lmKGEpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT09Yil7ZT0hMDticmVha31yZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn19fSkoYyk7dmFyIFE9Yy5ZaXx8UTtuZXcgUTt2YXIgZj1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLmRhdGE9CmJ8fHt9fWMuWGk9YTthLlFhPWZ1bmN0aW9uKGIsYSl7dmFyIGU9e30sZztmb3IoZyBpbiBhKWVbZ109YVtnXTtmb3IoZyBpbiBiKWVbZ109YltnXTtyZXR1cm4gZX07YS5RbT17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07YS5JbT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Rbz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTthLmlsPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5YZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07YS5QZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTthLlVmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTthLllmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07YS5saz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07YS5TZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTthLndvPXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5IbT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5qbD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlJvPXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2EuWWs9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTthLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2Eud2M9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTthLldmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07YS5uaz17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTthLlljPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07YS5iZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07YS5lZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2EubWs9e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTthLmlpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2EuS209e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07YS53ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07YS52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwphLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07YS5Qbz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zbz17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudG89e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnJvPXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2EuSm09e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2EucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLlhpfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPWMueWt8fGphO25ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWmk9YTthLnByb3RvdHlwZT17QWU6ZnVuY3Rpb24oYil7dmFyIGE9MCxlLGcsYztpZigwPT1iLmxlbmd0aClyZXR1cm4gYTtlPTA7Zm9yKGM9Yi5sZW5ndGg7ZTxjO2UrKylnPWIuY2hhckNvZGVBdChlKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gTWF0aC5hYnMoYSl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4Iil9LEVsOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5NYXx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0iIiwKZT1hLmxlbmd0aC0xLGQ9IiI7MDw9ZTtkKz1hW2UtLV0pO3JldHVybiBkfSxnYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMuaGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksZD0iIixlPTA7ZTxhLmxlbmd0aDtlKyspZCs9dGhpcy5vZChhW2VdKTswPT1kLmxlbmd0aCYmKGQ9InpvcmsiKTtyZXR1cm4gZH0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkVsKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGQ9IiIsZT0wO2U8YS5sZW5ndGg7ZSsrKWQrPXRoaXMub2QoYVtlXSk7MD09ZC5sZW5ndGgmJihkPSJ6b3JrIik7cmV0dXJuIGR9fX0pKGMpO3ZhciBKPWMuWml8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnprPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9CmMuemt8fGthO25ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9dmFyIGI9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2EuZXh0ZW5kPWZ1bmN0aW9uKGQpe3ZhciBlPXRoaXMucHJvdG90eXBlLGc9T2JqZWN0LmNyZWF0ZShlKSxjO2ZvcihjIGluIGQpZ1tjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGRbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW2NdJiZiLnRlc3QoZFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLmo7dGhpcy5qPWVbYV07dmFyIGc9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWQ7cmV0dXJuIGd9fShjLGRbY10pOmRbY107ZD0iZnVuY3Rpb24iPT09dHlwZW9mIGcuZz9nLmhhc093blByb3BlcnR5KCJpbml0Iik/CmcuZzpmdW5jdGlvbigpe2UuZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtkLnByb3RvdHlwZT1nO2cuY29uc3RydWN0b3I9ZDtkLmV4dGVuZD1hLmV4dGVuZDtyZXR1cm4gZH07Yy5IaT1hfSkoYyk7dmFyIEw9Yy5IaXx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYT1jLmJrfHxsYTtuZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkJqPUwuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuSWE9e307dGhpcy5GPW51bGw7dGhpcy5MYz0xMDA7dGhpcy5JYj0wO3RoaXMuVGE9MTUwO3RoaXMuTGI9MDt0aGlzLnduKGEpfSxmOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYT8odGhpcy5JYisrLHRoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuVGEmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTGMpKX0scG46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLlRhPyEwOiExfSxkZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHduOmZ1bmN0aW9uKGEpe3RoaXMuRj1hfSxDbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZ9LE06ZnVuY3Rpb24oYSl7dGhpcy5JYVthLmhhKCldPWE7TSYmTS5oaCYmTS5UbihhKX0sRXA6ZnVuY3Rpb24oKXtyZXR1cm4gZi55ZSh0aGlzLklhKX0sSzpmdW5jdGlvbihhKXt2YXIgYj1hLnZpZGVvVGFnLGQ7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2RdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLklhW2EuaGEoKV0/ITA6ITF9LGltOmZ1bmN0aW9uKGEpe2E9YS5GYSgpO2Zvcih2YXIgYiBpbiB0aGlzLklhKWlmKGEuaWQ9PQp0aGlzLklhW2JdLkZhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFdwOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuQmp8fHQ7KGZ1bmN0aW9uKGMpe2MuRGo9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5MYz0xMDt0aGlzLkliPTA7dGhpcy5UYT01MDt0aGlzLlQ9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWE7dGhpcy5CYj0iIjt0aGlzLnJnPSExO3RoaXMuSigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxkPXRoaXMuRmEoKSxlPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2UmJihhLnBsYXllcj1lKTtyZXR1cm4gYX0sSjpmdW5jdGlvbigpe30sSmE6ZnVuY3Rpb24oKXt9LApIbjpmdW5jdGlvbihhKXt0aGlzLlQ9YX0sRnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UfSx6bjpmdW5jdGlvbihhKXt0aGlzLlBlPWF9LERwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUGV9LE9lOmZ1bmN0aW9uKCl7fSxPOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5UYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSx0aGlzLkxjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChhKXt9fSxGZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihhKXt0aGlzLmlkPWF9LFlwOmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO3RoaXMudmlkZW9UYWc9YTt0aGlzLlRsKCl8fHRoaXMucGsoKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30scGs6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGYuVygxMCkpfSxUbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihhKXt0aGlzLmNvbnRhaW5lcj0KYX0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5jdXJyZW50VGltZT9hLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LFo6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxyYTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnZpZGVvVGFnO3JldHVybiBhJiZhLm11dGVkP2EubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEloOmZ1bmN0aW9uKGEpe3RoaXMuQmI9YX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sRGg6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LElwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5CYiYmKGE9ITApO3JldHVybiBhfSxUcDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMudmlkZW9UYWc7YiYmYi5nZXRBdHRyaWJ1dGUoImlkIikmJihhPWIuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBxPWMuRGp8fHE7KGZ1bmN0aW9uKGMpe2MudGk9TC5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLkY9dGhpcy5wbGF5ZXI9IiI7dGhpcy5MZj0iMSI7dGhpcy5NZj0iMiI7dGhpcy5paz0iMyI7dGhpcy5VYz0wO3RoaXMubWg9CjMwO3RoaXMuUGI9W107dGhpcy5nYj1bXTt0aGlzLm1jPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlpmPXRoaXMuZWk9ITE7dGhpcy5zdGF0dXM9dGhpcy5VYzt0aGlzLmlkPWYuVygxMCk7dGhpcy5qZihhKTt0aGlzLnhuKGIpfSxmOmZ1bmN0aW9uKCl7fSxvYTpmdW5jdGlvbigpe3RoaXMuZWl8fCh0aGlzLmVpPSEwLGYuTWUoKSl9LFVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5aYiYmIW1hJiYobWE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2EpKX0sYm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9bmV3IEo7d2luZG93W2IuZ2EoKV18fCh3aW5kb3dbYi5nYSgpXT17fSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXXx8KHdpbmRvd1tiLmdhKCldW2EuaGEoKV09e30sd2luZG93W2IuZ2EoKV1bYS5oYSgpXS5pbml0aWF0b3I9CmYuV2IoKSk7d2luZG93W2IuZ2EoKV1bYS5oYSgpXVtmLldiKCldP3dpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXSsrOndpbmRvd1tiLmdhKCldW2EuaGEoKV1bZi5XYigpXT0xfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj0hMCxkPW5ldyBKO3dpbmRvd1tkLmdhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldJiZ3aW5kb3dbZC5nYSgpXVthLmhhKCldLmluaXRpYXRvciE9Zi5XYigpJiYodGhpcy5rZigpLGI9ITEpO3JldHVybiBifSxDOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITA7YSYmKGQ9ITEpO2lmKCF0aGlzLnZhKCkpe3RoaXMuYm0oKTtpZighdGhpcy5mbSgpKXtmLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5rZigpO3JldHVybn10aGlzLmtmKCk7dGhpcy5GKHRoaXMuZ2V0UGxheWVyKCksZCk7dGhpcy5ZaCgpO3RoaXMuWmY9ITA7YiYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbTpmdW5jdGlvbihhLApiKXt0aGlzLnZhKCl8fCh0aGlzLlBiLnB1c2goYSksdGhpcy5nYi5wdXNoKHtyZWFzb246YSxkZXRhaWw6Yn0pKX0sWWg6ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYj1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1mLnVuaXF1ZSh0aGlzLlBiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGQ9MDtkPHRoaXMuZ2IubGVuZ3RoO2QrKyl0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXT09dGhpcy5tY1thXSYmYi5wdXNoKHRoaXMuZ2JbZF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbZF0ucmVhc29uXTx0aGlzLm1jW2FdJiYoYj1bXSxiLnB1c2godGhpcy5nYltkXS5kZXRhaWwpLGE9dGhpcy5nYltkXS5yZWFzb24pO3RoaXMubWNbYV18fChhPSJ1bmtub3duIixiPVtdKTswPGIubGVuZ3RoJiYoZD1mLnVuaXF1ZShiKSxhPWErIi0iK2Quam9pbigiLSIpKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLAphLCEwLGIpfX0sSHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGtmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0sRW46ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlrfSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxwcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuVWN9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seG46ZnVuY3Rpb24oYSl7dGhpcy5GPWF9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRn0sem06ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLnRpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMudmk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBuYT1jLnZpfHxuYTtuZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5OaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5OaXx8b2E7KGZ1bmN0aW9uKGMpe2MuT2k9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLnFwO2I/Yi5uYT9iLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGc9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihnKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihnKz1iLmdldE1lc3NhZ2UoKSk7Zy5pbmRleE9mJiYoMDw9Zy5pbmRleE9mKCIxMDA5Iil8fDA8PWcuaW5kZXhPZigiMzAzIil8fDA8PWcuaW5kZXhPZigiNDAzIikpPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksCjEwMCk6YS5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm0oImZyYW1ld29yayIpLHRoaXMuaSgpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuT2l8fHBhOyhmdW5jdGlvbihjKXtjLlBpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBhPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IHBhKGEsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBxYT1jLlBpfHxxYTsobmV3IHFhKHIpKS5mKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ZbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHJhPWMuWWx8fHJhO25ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dGhpcy53ZygpO3RoaXMueWcoKTt0aGlzLlhrPSExfSx3ZzpmdW5jdGlvbigpe3RoaXMuJGI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLiRiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLlMoYSl9LHlnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGIpe3ZhciBhPXRoaXMuRmEoKSxiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmJ8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwodGhpcy4kYj0hMCk7dGhpcy5WKGIpfX0sSmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudClhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuVCYmKDAsdGhpcy5UKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJmEuX2V2ZW50cy50aW1lJiZhLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlQmJigwLHRoaXMuVCkoKX0uYmluZCh0aGlzKX0pLGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5UJiYoMCx0aGlzLlQpKCl9LmJpbmQodGhpcykpfSxPZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKSl9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0UG9zaXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmIuZ2V0UG9zaXRpb24mJjMwPGIuZ2V0UG9zaXRpb24oKSYmMzA8Yi5nZXREdXJhdGlvbigpLWIuZ2V0UG9zaXRpb24oKSYmdGhpcy5QZSYmKDAsdGhpcy5QZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtpZighYS5nZXRTdGF0ZXx8InBsYXlpbmciIT1hLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSx4YTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0RnVsbHNjcmVlbiYmYS5nZXRGdWxsc2NyZWVuKCkmJmEuc2V0RnVsbHNjcmVlbigpfSxyYTpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5wbGF5ZXI7Yi5nZXRNdXRlJiZiLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfSx2ZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnBsYXllcixiPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYj1hLmdldFZvbHVtZSgpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBzYT1jLmdqfHxzYTsoZnVuY3Rpb24oYyl7Yy5maj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxKOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5XYz0hMTt0aGlzLmNlPTE7dGhpcy5YYz1bXTt0aGlzLnViPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2EuZ2V0Q29uZmlnJiYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmc/KGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5jZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMudWI9ITApOihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnViPSEwKSxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnViPSEwKSkpLGIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy51Yj0hMCkpOnRoaXMucygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkQ29tcGxldGUmJmEuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDb21wbGV0ZSIpO3RoaXMuV2M9ITB9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJgphLl9ldmVudHMuYWRDbGljayYmYS5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEltcHJlc3Npb24mJmEuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZEltcHJlc3Npb24iKTt0aGlzLlVlKCl9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZE1ldGEmJmEuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkU2tpcHBlZCYmYS5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLmFkVGltZSYmYS5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5taCYmIXRoaXMudmEoKSYmKHRoaXMudWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5pKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmEuX2V2ZW50cyYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYS5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy52YSgpJiYodGhpcy5rYSgpLHRoaXMuZ2V0UGxheWVyKCkuWGs9ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkJiO2EmJihhLnlkKCksYS5yZSgpKX19LmJpbmQodGhpcyl9KTtpZihhLm9uQWRDb21wbGV0ZSlhLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMucygib25BZENvbXBsZXRlIik7dGhpcy5XYz0hMH0uYmluZCh0aGlzKSk7aWYoYS5vbkFkSW1wcmVzc2lvbilhLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkUGxheSlhLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYS5vbkFkVGltZSlhLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm1oJiYhdGhpcy52YSgpJiYodGhpcy51Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLmkoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YWc7LTE9PXRoaXMuWGMuaW5kZXhPZihiKSYmdGhpcy5YYy5wdXNoKGIpOyIxMDEiPT1hLmNvZGV8fCIxMDAxIj09YS5jb2RlPyh0aGlzLnMoKSx0aGlzLm9hKCkpOjkwMD09YS5jb2RlJiYwPGEubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMucygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLnMoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLlhjLmxlbmd0aD49dGhpcy5jZSYmdGhpcy5pKCkpfSx6bTpmdW5jdGlvbihhKXt0aGlzLmooIkpXOiAiK2EudHlwZSl9LGk6ZnVuY3Rpb24oYSl7YT90aGlzLnRlP3RoaXMudGUrKzp0aGlzLnRlPTE6dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Zi5xZihiLnZpZGVvVGFnKT9iLiRiP3RoaXMucygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuV2N8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLnNlPnRoaXMudGUmJihhPSExKSx0aGlzLkMoYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDUwKTooYi53ZygpLGIueWcoKSxiLiRifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB0YT1jLmZqfHx0YTsoZnVuY3Rpb24oYyl7Yy5oaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1mLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLnlsKCl8fCFhLmF1dGhvcml0eXx8IWEuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxkJiZkKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWEucHVzaChiW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTt0aGlzLksoZCl8fHRoaXMuaW0oZCl8fCh0aGlzLk0oZCksZD1uZXcgdGEoZCx0aGlzLkYpLGQuSigpLGQuZigpKX19dGhpcy5PKCl9fSxCcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSx5bDpmdW5jdGlvbigpe3ZhciBhPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYud2IoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuaGp8fHVhLHZhPW5ldyB1YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy4kbHx8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuV2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuUyhiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuTWQoYSl9LmJpbmQodGhpcykpfSwKTWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuVCYmdGhpcy5UKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0scmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHhhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChkKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLldqfHx4YTsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5OPXRoaXMuTnx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaT0hMDt0aGlzLnJjPXRoaXMuV2c9ITE7dGhpcy5HbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMucGgoKSx0aGlzLkhrKCksCnRoaXMucWIoKSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiBmLlkoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sVXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmhhKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlUsIjsiLHR5cGVvZiBhLlUsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVT9hLlUuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlU/dHlwZW9mIGEuVS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5EYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5EYT9hLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkRhP3R5cGVvZiBhLmltYS5EYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuRGE/YS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5EYT90eXBlb2YgYS5HLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy4kZDoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLiRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5hZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5uYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5qZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuamU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy5qZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLnloKX0sQmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxDYzpmdW5jdGlvbigpe2lmKCF0aGlzLm5hKXt2YXIgYT10aGlzLkJjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5uYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5uYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5uYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5uYX0sCkpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWMpe3ZhciBhPXRoaXMuQmMoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5FYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuRWM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5FY30sZ206ZnVuY3Rpb24oKXtpZighdGhpcy5WZyl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5lbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMuVmc9ITApfXJldHVybiB0aGlzLlZnfSxlbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuYWQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmFkPSEwKTtyZXR1cm4gdGhpcy5hZH0scWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihkPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLmZuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZm46ZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3ZhciBhPXRoaXMuSmcoKTtpZihhfHx0aGlzLnZhKCkpe3ZhciBiPSJhZEVycm9yIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtmLlNhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGYuWSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitlKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuc2M9ITA7Zi5ZKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitlKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtmLlkoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxBcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2cmJmEuYWRzJiYKKHRoaXMub2c9YS5hZHMpO3JldHVybiB0aGlzLm9nfSxIazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMua2EoKTt0aGlzLmNhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSk7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5OKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpO3RoaXMuVWUoKX0uYmluZCh0aGlzKSl9LGpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUilob21hZFV0aWxzLlJhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLkpnKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0scGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuZ20oKSl7dmFyIGI9dGhpcy5CYygpLApkPXRoaXMuQ2MoKTtiJiZkJiYodGhpcy5yY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMucygpOih0aGlzLmNhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLldnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYygpLGI9dGhpcy5DYygpO2EmJiFiPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuY2EoKSk6KHRoaXMuY2EoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLldnPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy52YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGgoKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PQphfHw0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufWlmKCF0aGlzLkpjJiYoZi5ZKCJnaWdhLmRlIil8fGYuWSgic3BpZWxldGlwcHMuZGUiKXx8Zi5ZKCJraW5vLmRlIil8fGYuWSgiZGVzaXJlZC5kZSIpKSl7dGhpcy5KYz0hMDt0cnl7Zi52ZCgiaHR0cHM6Ly9hZHNlcnZlci5zY2huZWV2b25tb3JnZW4uY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTthPSFmLmJiKGEuY2MpO2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsYSwhMCk7YSYmZi50cmFjaygic3RhdHNfaGRfM3BjX2Jyb3dzZXIiLGYudWwoKSwhMCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXtmLnRyYWNrKCJzdGF0c19oZF8zcGNfZW1wdHkiLCJmYWlsLWxvYWQiLCEwKX0sITApfWNhdGNoKGcpe2YudHJhY2soInN0YXRzX2hkXzNwY19lbXB0eSIsImZhaWwtY2F0Y2giLCEwKX19fSxJazpmdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnhjPSJ1bmtub3duIik7CnZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMueGMhPWEuYWRzLnN0YXRlJiYodGhpcy54Yz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy54Yyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnhjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaygpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXswPD1mLlhiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk4/KHRoaXMuYmE9ITAsdGhpcy5pKCEwKSk6KHRoaXMuYmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy52YSgpfHwKKGF8fCh0aGlzLmRpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLmRpLGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxRazpmdW5jdGlvbigpe3RoaXMuSnB8fCgxMDx0aGlzLkNvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuQ28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5ubigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5RaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxubjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ebyl7dGhpcy5Ebz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiKwpiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5Wanx8eWE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuT2god2luZG93KTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl0cnl7Yj1ifHx0aGlzLk9oKGFbZF0pfWNhdGNoKGUpe310aGlzLk8oKX19LE9oOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYueWUoYikpe2E9Yjtmb3IodmFyIGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiYoYj1uZXcgeGEoYVtkXSksYi5qYXx8dGhpcy5LKGIpfHwKITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5NKGIpLChuZXcgeWEoYix0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTt2YXIgemE9Yy5Yanx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Taz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEJhPWMuU2t8fEJhO25ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuV2U9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiYKYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuUyhiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuWigpfSxTbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkJiLGQ9dGhpcy5oYSgpLGU9IiI7YS5tZW1vJiYoZT1hLm1lbW8udmlkZW9pZCk7ZSYmYiYmYi5aYiYmKDA8PWQuaW5kZXhPZihlKXx8Yi55ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuV2U9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0seGE6ZnVuY3Rpb24oKXt0aGlzLldlKys7aWYoMTA8dGhpcy5XZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxNZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfX0pfSkoYyk7dmFyIENhPWMueWp8fENhOyhmdW5jdGlvbihjKXtjLnhqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMudWUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51ZT0KITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmF9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgZD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZD0hMDtkfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGQ9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTj1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBkfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGQ9YS5nZXRFcnJvcigpO2lmKGQuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZC5nZXRFcnJvckNvZGUmJmIoZC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSYmYVtlXS5hZEVycm9yJiZhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkFhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk49dGhpcy5OfHwhMTt0aGlzLnphKCk7dmFyIGI9d2luZG93Lm92VmlkZW87Ynx8KGI9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YiYmYi5yZWdpc3RlckV2ZW50JiYhdGhpcy5sbD8oYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTik7dGhpcy5pKCl9LmJpbmQodGhpcykpLHRoaXMubGw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGIpe2EuU20oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIERhPWMueGp8fERhOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJgp3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1uZXcgQ2EoYVtiXSk7ZC5qYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgRGEoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIEVhPWMuemp8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBHYT1jLnBvfHxHYTtuZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKKGZ1bmN0aW9uKGMpe2MuZGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWYuR2coYSwiZWxlbWVudElEIik7c3dpdGNoKGEuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjpiLnBhcmVudE5vZGUmJihiPWIucGFyZW50Tm9kZSl9dGhpcy5VbT1hLnBvc2l0aW9uaW5nO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Quc3R5bGUud2lkdGg9YS53aWR0aDtkLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7ZC5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Quc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Quc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7ZC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuVW0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIpO2JyZWFrOwpjYXNlICJhZnRlciI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGIubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6Yi5hcHBlbmRDaGlsZChkKTticmVhaztkZWZhdWx0OmIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZCxiKX10aGlzLlMoZCk7dGhpcy5WKGQpO3RoaXMubWQ9ZH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLm1kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tZCl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBrOmZ1bmN0aW9uKCl7Zi5iaCh0aGlzLm1kKTtmLkZlKHRoaXMubWQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QaygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuZGp8fEhhOyhmdW5jdGlvbihjKXtjLmNqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7CnRoaXMuQyghMCl9fSl9KShjKTt2YXIgSWE9Yy5janx8SWE7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYT1tLmlucmVhZCxiPWYuR2coYSwiZWxlbWVudElEIik7aWYoZi5iaChiKSYmKGE9bmV3IEhhKGEpLCF0aGlzLksoYSkpKXt0aGlzLk0oYSk7KG5ldyBJYShhLHRoaXMuRikpLmYoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5lanx8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuYmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuJGk9YTthLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0seW46ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGQpe3RoaXMuZGF0YVthXT1kfSxxazpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChkKXt9fX19KShjKTt2YXIgQT1jLiRpfHxBOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZCxlLGcpe3RoaXMuWGE9Yjt0aGlzLkJnPXRoaXMubWk9ITE7dGhpcy5xaD1lO3RoaXMuUGg9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEEoYikpO3ZhciBjPXRoaXMuZmI9bmV3IFhNTEh0dHBSZXF1ZXN0OwpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFkfHw0IT1jLnJlYWR5U3RhdGV8fDIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXN8fGQoYyk7aWYoZSYmND09Yy5yZWFkeVN0YXRlJiYyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzKWUoYyk7ZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLkllKHRoaXMuWGEudXJsKSYmbC5QZCl7dmFyIGY9bmV3IEEoYi51cmwpO2YueW4oIlBPU1QiKTtmLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGYsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5lYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZWEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWcmJjQhPWMucmVhZHlTdGF0ZSYmZyhjKX0uYmluZCh0aGlzKX0KYy5haj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGQ9YSxhPSIiLGU7Zm9yKGUgaW4gZClhKz0iJiIrZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRbZV0pO2E9YS5zdWJzdHIoMSl9dGhpcy5CZyYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5mYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuUGg/dGhpcy5mYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmZiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMubWl8fCh0aGlzLmZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5mYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLAoidHJ1ZSIpLHRoaXMuZmIuc2VuZChhKX1jYXRjaChnKXtsJiZsLkllKHRoaXMuWGEudXJsKT9sLlBkP2wuZWEoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuSWUodGhpcy5YYS51cmwpLHRoaXMucWgmJnRoaXMucWgoKX1yZXR1cm4gdGhpcy5mYn19fSkoYyk7dmFyIE1hPWMuYWp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT10aGlzLlhkPSExfWMuSWk9YTthLnByb3RvdHlwZT17Q246ZnVuY3Rpb24oYSl7dGhpcy5YZD1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLkNhPWF9LGxuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGQpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGQsYSl9KX12YXIgZD17Wm86IkFkQ2xpY2tUaHJ1IiwKYXA6IkFkRXJyb3IiLGJwOiJBZFN0b3BwZWQiLGZwOiJBZExpbmVhckNoYW5nZSIsZ3A6IkFkVGFnUGFyc2VkIixqcDoiQWRWaWRlb0NvbXBsZXRlIixtcDoiQWRMb2FkZWQiLG5wOiJBZFNraXBwZWQiLG9wOiJBZFN0YXJ0ZWQiLGNwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZXA6IkFkSW1wcmVzc2lvbiIsJG86IkFkQ3JlYXRpdmVWaWV3IixocDoiQWRWaWRlb01pZHBvaW50IixpcDoiQWRQYXVzZWQiLGtwOiJBZFZpZGVvU3RhcnQiLGxwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoZD13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhKHRoaXMuWGQsZFtlXSl9LGtuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGQpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsZCk7Yi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsZCxhKX0pfWlmKHRoaXMuQ2EmJnRoaXMuQ2EuV2QpZm9yKHZhciBkIGluIHRoaXMuQ2EuV2QpdGhpcy5DYS5XZC5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLkNhLHRoaXMuQ2EuV2RbZF0pO3RoaXMuQ2EmJnRoaXMuQ2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPXRoaXMuQ2EuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuWGQmJnRoaXMubG4oKTt0aGlzLkNhJiZ0aGlzLmtuKCl9fX0pKGMpO3ZhciBOYT1jLklpfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuUmE9ITE7dGhpcy51Yz0iIjt0aGlzLmtlPXRoaXMudGM9dGhpcy52Yj1udWxsO3RoaXMuZmw9dGhpcy5KYj10aGlzLmloPSExO3RoaXMuR2E9IiI7dGhpcy5laD0hMTt0aGlzLnVhPQp0aGlzLnFkPSIiO3RoaXMuJGc9dGhpcy5SPXRoaXMuaXNFbmFibGVkPXRoaXMuYmY9ITE7dGhpcy5sYT1bXTt0aGlzLlBnPXRoaXMuZWM9IiI7dGhpcy5HZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5PYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5sYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5mYz0iIjt0aGlzLmdjPVtdO3RoaXMuaGM9W107dGhpcy5MZD1bXTt0aGlzLlBjPSIiO3RoaXMueGI9ITE7dGhpcy50Zj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkRjPSExO3RoaXMuUms9dGhpcy5SZD1udWxsO3RoaXMuS2g9dGhpcy5qYz10aGlzLnRnPXRoaXMud2Y9dGhpcy5QZD10aGlzLm1lPXRoaXMuVmM9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5yZD0KMDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuY2Q9ITE7dGhpcy5OYT0xRTM7dGhpcy5PZj0iIn1jLmJqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlJhLGFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLnZiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMua2UsYml0cmF0ZTp0aGlzLk5hLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuZmwsaG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCxjbGllbnRDb25maWc6dGhpcy51YSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlIsaXNCbG9ja2VkOnRoaXMuJGcsc2VydmVyOnRoaXMubGEsc3ZtQ29uZmlnOnRoaXMuZWMsaG9tYWRBZHBhdGg6dGhpcy5QZyxIT01BRF9WRVJJRklFRDp0aGlzLkdmLApIT01BRF9CTE9DS0VEOnRoaXMuRmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuT2IsSE9NQURfQURCTE9DS0VSOnRoaXMubGMsdGVzdEhpZGU6dGhpcy5mYyx0ZXN0VGFnczp0aGlzLmdjLHRlc3RUYWdzSlM6dGhpcy5oYyx0ZXN0VGFnc1hIUjp0aGlzLkxkLHRlc3QzUENvb2tpZTp0aGlzLlBjLHRocm90dGxlOnRoaXMudGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5EYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLlJrLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuVmMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLm1lLHVzZVN0cmljdENoZWNrczp0aGlzLlBkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuaGIsc2l0ZUNvbmZpZzp0aGlzLkJhLHNlcnZlcklkOnRoaXMuSGgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmpiLHZwYWlkOnRoaXMuamMsc2tpcEFsbG93ZWQ6dGhpcy5LaCx2bWFwczp0aGlzLmppLAphbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuY2QsYWRGYWxsYmFja1VSTDp0aGlzLk9mfX0sUmw6ZnVuY3Rpb24oKXt2YXIgYT0hMSxkO2ZvcihkIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltkXSYmMT09dGhpcy5oYltkXSYmKGE9ITApO3JldHVybiBhfSxnZjpmdW5jdGlvbihhKXt0aGlzLmhiW2FdPSEwfSx6bDpmdW5jdGlvbigpe3ZhciBhPVtdLGQ7Zm9yKGQgaW4gdGhpcy5oYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmhiW2RdJiYxPT10aGlzLmhiW2RdJiZhLnB1c2goZCk7cmV0dXJuIGF9LEpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7CmE9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5IYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLkNrKGEpfSx3YTpmdW5jdGlvbihhLGQsZSl7dmFyIGc9IiIsYz0iIixmPSIiLGg9IiI7aWYoIXRoaXMuUmEmJiFkKXJldHVybiBuZXcgQShhKTtnPXRoaXMuSGUoYSk7Yz10aGlzLnNhKGEpO2c/KHRoaXMuRmMoKT9mPWE6Zj1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixoPWMucGF0aC5zdWJzdHIoMSkpOihmPXRoaXMuS2MoKSxoPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtlJiYodGhpcy51Y3x8dGhpcy52Ynx8dGhpcy50Y3x8dGhpcy5rZSkmJihoPXRoaXMuRG0oaCkpO2E9bmV3IEEoZik7YS51cmw9ZjtmPSIiO2Y9Zz9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6CnRoaXMuQmwoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1mO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoaCk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxIZTpmdW5jdGlvbihhKXt2YXIgZD0hMSxlPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhlPWUuZXhlYyhhKSkmJihlWzJdfHxlWzVdKT9kPSEwOnRoaXMuRmMoKSYmKGU9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChlPWUuZXhlYyhhKSkmJmVbNF0mJihkPSEwKSk7cmV0dXJuIGR9LEZjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD0iIjt0aGlzLmxhJiZ0aGlzLmxhLmxlbmd0aCYmMDx0aGlzLmxhLmxlbmd0aCYmKGQ9dGhpcy5sYVswXSxkPWQucmVwbGFjZSgiaHR0cHM6Ly8iLAoiIiksZD1kLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxkPWQucmVwbGFjZSgiLy8iLCIiKSxhPShhPWQuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sSWU6ZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZT1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2UmJihlWzJdfHxlWzVdKT9kPSEwOmQ9dGhpcy5IZShhKTtyZXR1cm4gZH0sQmw6ZnVuY3Rpb24oYSl7dmFyIGQ9IiIsZT0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkdhJiYwPHRoaXMuR2EubGVuZ3RoKXJldHVybiB0aGlzLkdhO2ZvcihlIGluIHRoaXMuR2EpaWYoZD10aGlzLkdhW2VdLGQuaGFzT3duUHJvcGVydHkoInVybCIpJiZkLnVybD09PWEpcmV0dXJuIGQudnA7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhW3RoaXMuSGhdfSxLYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxkPXRoaXMuSmgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrCiIiKSxlPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGQuc2xpY2UoMCwtMSkrIiIrZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZS5sZW5ndGgpXSl9LG5oOmZ1bmN0aW9uKGEsZCxlKXthPSExO2Q9IiI7aWYoZS5ldmFsKXRyeXtkPWV2YWwoIigiK2UuZXZhbCsiKSgpIil9Y2F0Y2goZyl7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZS5mYWxsYmFjayYmKGQ9ZS5mYWxsYmFjayk7cmV0dXJuIGR9LENtOmZ1bmN0aW9uKGEsZCl7dmFyIGU9Zi5zYShhKSxnPSIiLGc9IiIsYztmb3IoYyBpbiBkKXtpZihkW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBoPWRlY29kZVVSSUNvbXBvbmVudChlLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGc9e30sSD0wO0g8aC5sZW5ndGg7SCsrKXt2YXIgaz1oW0hdLnNwbGl0KCI9Iik7Z1trWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBkW2NdLnN1YnZhbHVlcylnW2xdPXRoaXMubmgoZ1tsXSxsLGRbY10uc3VidmFsdWVzW2xdKTsKaD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5uaChlLnF1ZXJ5S2V5W2NdLGMsZFtjXSk7ZS5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZS5xdWVyeUtleSlsLnB1c2goYysiPSIrZS5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZS5ob3N0K2UucGF0aCsiPyIrbC5qb2luKCImIil9LERtOmZ1bmN0aW9uKGEpe3RoaXMudWMmJihhKz10aGlzLnVjKTtpZih0aGlzLnZiKWZvcih2YXIgZCBpbiB0aGlzLnZiKXRoaXMudmIuaGFzT3duUHJvcGVydHkoZCkmJihhPWEucmVwbGFjZShkLHRoaXMudmJbZF0pKTt0aGlzLnRjJiYoYT10aGlzLkNtKGEsdGhpcy50YykpO3JldHVybiBhfSxPazpmdW5jdGlvbigpe3RoaXMuQmEmJnRoaXMuQmEuY2xpZW50QVBJcyYmdGhpcy5Kayh0aGlzLkJhLmNsaWVudEFQSXMpfSxKazpmdW5jdGlvbihhKXtpZihhKXt2YXIgZD1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJgpkLkNuKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmZC5CbihhLnBsYXllcik7ZC5mKCl9fSxnOmZ1bmN0aW9uKGEsZCxlLGcsYyxmKXtsPXRoaXM7dGhpcy5laD0hMDt0aGlzLnFkPWE7dGhpcy51YT1kO3RoaXMuYmY9ZTt0aGlzLlJkPWc7dGhpcy55Yz1jO3RoaXMuQmE9Znx8e307dGhpcy5PaygpO3RoaXMudm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudWEpdGhpcy50bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy51YSl0cnl7dGhpcy51YT1kKCksdGhpcy52YygpfWNhdGNoKGgpe3RoaXMuZWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHRoaXMudWEpdHJ5e3RoaXMudWE9ZCx0aGlzLnZjKCl9Y2F0Y2goayl7dGhpcy5lYSgibm9DbGllbnRDb25maWciKX19LHBiOmZ1bmN0aW9uKGEpe3ZhciBkPW51bGw7dHJ5e2Q9bmV3IEV2ZW50KGEpfWNhdGNoKGUpe2Q9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZC5pbml0RXZlbnQoImN1c3RvbSIsCiEwLCExKX1yZXR1cm4gZH0sdm06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMucWQrdGhpcy5oZSgiZ2xvYmFsIikpLHRoaXMuT2wuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy52YygpfS5iaW5kKHRoaXMpLCEwKX0sdG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBBKHRoaXMudWErdGhpcy5oZSgiY2xpZW50IiwtMSE9dGhpcy51YS5pbmRleE9mKCI/IikpKSx0aGlzLnZjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdmKCJjbGllbnQiKTt0aGlzLmVhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSxoZTpmdW5jdGlvbihhLGQpe3ZhciBlO2U9KGQ/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuSGIoKSk7dGhpcy5CYSYmdGhpcy5CYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGU9IiIpO3RoaXMuQmEmJnRoaXMuQmEubm9DYWNoZUJ1c3RlciYmCihlPSIiKTtyZXR1cm4gZX0sZWE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMubWUpe3RoaXMubWU9ITA7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGQpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMueWM9ITEpO3RoaXMueWMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy55Yz90aGlzLnljKCk6KGQoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoZCw1MDApKTt0aGlzLlI9dGhpcy4kZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5GZikpO3RoaXMuTWIoKTtmLnpjKGsuUW0pOyhkPWYuWGIodGhpcy5zZCgpKSl8fChkPWYuWGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtmLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE9sOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlIpe3ZhciBkPQp7fTt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChlKXtkLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmJiKGQuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMudWF8fHRoaXMuZWN8fHRoaXMuR2F8fHRoaXMudmMoKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfX0sdmM6ZnVuY3Rpb24oYSl7dmFyIGQ9ITE7YSYmKGQ9YS5yZXNwb25zZVRleHQpO3ZhciBlPXt9O2lmKGQpdHJ5e2U9SlNPTi5wYXJzZShkKX1jYXRjaChnKXtlPXRoaXMudWF9ZWxzZSBlPXRoaXMudWE7aWYoIWUuZW5hYmxlZHx8IWUuc2VydmVyfHwhZS5hbGlhcyl0cnl7ZT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmJiKGUuZW5hYmxlZCk7dGhpcy5SPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmxhPWUuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5sYS5sZW5ndGg7YSsrKXRoaXMubGFbYV09dGhpcy5sYVthXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGYuWSgid2ViLmRlIil8fGYuWSgiZ214Lm5ldCIpfHxmLlkoImdteC5hdCIpfHxmLlkoImdteC5jaCIpfHxmLlkoIjF1bmQxLmRlIikpJiYhdGhpcy5GYygpKWZvcihhPTA7YTx0aGlzLmxhLmxlbmd0aDthKyspdGhpcy5sYVthXT10aGlzLmxhW2FdLnJlcGxhY2UoIltoYXNoXSIsInNzbCIpLmNvbmNhdCgiW2hhc2hdLyIpO3RoaXMuZWM9ZS5jb25maWd8fCIiO3RoaXMuR2E9ZS5hbGlhc3x8bnVsbDt0aGlzLlBnPWUuYWRwYXRofHwiIjt0aGlzLkhoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmxhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuZWMmJnRoaXMuR2EmJgp0aGlzLmxhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5SYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLk1iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5SKXt2YXIgZD17fTtpZihhKXt2YXIgZD1uZXcgQSh0aGlzLktjKCkpLGU9dGhpcy5zYSh0aGlzLmVjKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2QuZGF0YS5ob21hZF91cmxfc3VmZml4PWUucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtkLm1ldGhvZD0iUE9TVCJ9ZWxzZSBkPW5ldyBBKHRoaXMuZWMrdGhpcy5oZSgiY3VzdG9tZXIiKSk7dGhpcy5IYShkLHRoaXMuV24uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZ2YoImN1c3RvbWVyIik7YT90aGlzLkxqP3RoaXMuZWEoIm5vU1ZNQ29uZmlnIik6Cih0aGlzLkxqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sV246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGUpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuUGQ9dGhpcy5iYihkLnN0cmljdCk7dGhpcy53Zj10aGlzLmJiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmJiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5iYihkLmVuYWJsZWQpO3RoaXMuZmM9ZC50ZXN0aGlkZXx8IiI7dGhpcy5oYz1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLkxkPQpkLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuUGM9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMudWM9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy52Yj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy50Yz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMua2U9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9ZC5qc3BvcHVwc3x8ITE7dGhpcy5KYj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1kLnZwYWlkfHwhMTt0aGlzLkJhLnZwYWlkPXRoaXMuamM7dGhpcy5LaD1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5qaT1kLnZtYXBzfHwiIjt0aGlzLmNkPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5OYT1kLmJpdHJhdGV8fDFFMzt0aGlzLk9mPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLnRmPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuRGMmJnRoaXMuaXNFbmFibGVkPwoodGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmlvKCkmJih0aGlzLmZjfHx0aGlzLmhjfHx0aGlzLmdjfHx0aGlzLkxkKT90aGlzLmJmPyh0aGlzLlJhPXRoaXMuUj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMub2UoKSx0aGlzLk1iKCkpOnRoaXMuWm4oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5zZigpKX19LFpuOmZ1bmN0aW9uKCl7dGhpcy5ZbigpO3RoaXMuJG4oKX0sJG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgZD0iaW5saW5lZXZhbGRhdGEiLGU9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWYuVygxMCksaD1mLlcoMTApLEg9Zi5XKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtlKys7ZD1kLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2UrKztkPWQucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZSsrO2Q9ZC5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStmLndiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYSl7fWlmKDMhPWUpe3ZhciBiPWYubGQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiYhYi5pc0VkZ2UmJiFmLlNhKCkpe2lmKHRoaXMuQmEmJnRoaXMuQmEucGxheWVyJiZ0aGlzLkJhLnBsYXllci5sZW5ndGgpe2YudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGQsITApOwpyZXR1cm59dGhpcy5lYSgiY3NwXyIrZCl9Zi50cmFjaygic3RhdHNfaGRfY3NwIixkLCEwKX19LmJpbmQodGhpcyksMUUzKX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCl9LEtkOmZ1bmN0aW9uKGEpe3RoaXMuVmM9ITA7dGhpcy5SfHwodGhpcy5SPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk1iKCksdGhpcy5vZSgpKX0sWW46ZnVuY3Rpb24oKXtpZih0aGlzLmZjKXt2YXIgYT1mLmxkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5sbSgpKXRoaXMuS2QodGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZmMpO2Quc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5mYyk7CmQuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWluLXdpZHRoOjEwcHg7bWluLWhlaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3ZhciBlPTA9PT1kLm9mZnNldFdpZHRofHwwPT09ZC5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKTthPWV9Y2F0Y2goZyl7fWE/dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VaCgpfX1lbHNlIHRoaXMuVWgoKX0sVGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zz1lLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoKSk7dGhpcy5jbyhnLDA8ZS5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWguYmluZCh0aGlzKSxkLmJpbmQodGhpcykpfWZ1bmN0aW9uIGQoKXt0aGlzLktkKHRoaXMubGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuZ2M9dGhpcy5MZCkmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZT10aGlzLmdjLnNsaWNlKCksZz0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUWgoKX0sY286ZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGcoKXtjKCkmJmQoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGY/KHdpbmRvdy5jbGVhclRpbWVvdXQoZiksITApOiExfXZhciBmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RoaXMuSGEobmV3IEEoYSksZyxmdW5jdGlvbigpe2MoKSYmZSgpfSl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2c9ZS5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkhiKCkpO3RoaXMuZW8oZywwPGUubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlRoLmJpbmQodGhpcyksZC5iaW5kKHRoaXMpKX1mdW5jdGlvbiBkKCl7dGhpcy5LZCh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpnKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5oYyYmdGhpcy5oYy5sZW5ndGgpe3ZhciBlPXRoaXMuaGMuc2xpY2UoKSxnO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5UaCgpfSxlbzpmdW5jdGlvbihhLGQsZSl7ZnVuY3Rpb24gZygpe2YoKSYmZCgpfWZ1bmN0aW9uIGMoKXtmKCkmJmUoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZygpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihkLGUpe2U9PWEmJmYoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2coKX19LFFoOmZ1bmN0aW9uKCl7aWYodGhpcy5QYyl0cnl7Zi52ZCh0aGlzLlBjLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLnhiPSF0aGlzLmJiKGEuY2MpO3RoaXMuc2YoKX0uYmluZCh0aGlzKSx0aGlzLlJoLmJpbmQodGhpcyksITApfWNhdGNoKGEpe3RoaXMuUmgoKX1lbHNlIHRoaXMuc2YoKX0sUmg6ZnVuY3Rpb24oKXt0aGlzLlI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLk1iKCk7dGhpcy5vZSgpfSxsbTpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LE1iOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGQ9IjAiO3RyeXtmLlNhKCkmJihhPSIxIil9Y2F0Y2goZSl7YT0yfXRoaXMuVmMmJgooZD0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitkLCEwKTt0aGlzLlBjJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMueGIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkdmKSk7dGhpcy5SZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlJkJiZ0aGlzLlJkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLnhifSl9LE5rOmZ1bmN0aW9uKCl7aWYodGhpcy53ZiYmdGhpcy5SbCgpKXt2YXIgYT10aGlzLnpsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxZaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZCl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsZCxlLGcsYywKaCl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsZCxlKTtnJiYoYS5taT0hMCk7YyYmZi5qbSgpJiYoYS5CZz0hMCk7aCYmKGEuUGg9ITApO3JldHVybiBhLmxvYWQoKX0sS2s6ZnVuY3Rpb24oKXtmLlNhKCl8fGYuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBkPW51bGwsZT1udWxsLGM9IiI7dHJ5eyhkPWEucmVzcG9uc2VYTUwpfHwoZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3RoaXMuZWEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZSlpZihhPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkZjKCl8fChhPXRoaXMuc2EoYyksYz1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmVhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsYyl9ZWxzZSB0aGlzLmVhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5lYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5lYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sWG46ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuaml9LExrOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShhLHRoaXMudm8uYmluZCh0aGlzKSx0aGlzLnVvLmJpbmQodGhpcykpfSx2bzpmdW5jdGlvbihhKXt2YXIgZD1udWxsLGU9bnVsbDt0cnl7KGQ9YS5yZXNwb25zZVhNTCl8fChkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1lfHx0aGlzLmtsKCl9LHVvOmZ1bmN0aW9uKCl7fSxrbDpmdW5jdGlvbigpe2YuemMoay5qbCk7Zi50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5lYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sb2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5KYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkpiLmxlbmd0aDthKyspe3ZhciBkPXRoaXMuSmJbYV07InJlcXVlc3QiPT1kLnR5cGUmJmYuWmEoZC51cmwsZC5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1kLnR5cGUpe3ZhciBlPW5ldyBKO3dpbmRvd1tlLmdhKCldPXRoaXM7Zi5aYShkLnVybCxkLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saW86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sSGI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sVzpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgZD0iIixlPTA7ZTxhO2UrKylkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gZH0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPSIiLGUsYyxmLGgsayxsLG09MDttPGEubGVuZ3RoOyllPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxoPWU+PjIsZT0oZSYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGY+PjYsbD1mJjYzLAppc05hTihjKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxkPWQrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGR9LHNhOmZ1bmN0aW9uKGEpe3ZhciBkPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBlPXt9LGM9MTQ7Yy0tOyllW2RbY11dPWFbY118fCIiO2UucXVlcnlLZXk9e307ZVtkWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGQpe2ImJihlLnF1ZXJ5S2V5W2JdPWQpfSk7cmV0dXJuIGV9LEpoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGIrPWUudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxmLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHEsdSx2LHc7cD1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZj1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZik7CnN3aXRjaChwJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChwPj4+MjkpO3gucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1lKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2Y9aztwPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1lKGYsNSkrKHAmcXx+cCZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWUoZiw1KSsocF5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWUocCwzMCkscD1mLGY9dztmb3IoYz00MDs1OT49YztjKyspdz1lKGYsNSkrKHAmcXxwJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1lKHAsMzApLHA9ZixmPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZShmLDUpKyhwXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZShwLDMwKSxwPWYsZj13O2s9aytmJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZChrKStkKGwpK2QobSkrZChyKStkKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ianx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5SbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFBhPWMuUm18fFBhO25ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxkLGUpe3RoaXMuYT1hO2EuYy5QP3RoaXMuJGE9YS5jLlAoKTp0aGlzLiRhPSIiO2EuYy5ZZyYmYS5jLllnKHtwYXVzZTp0aGlzLnlkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuRmguYmluZCh0aGlzKSxtdXRlOnRoaXMuUWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5vby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmliO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuVWI9dGhpcy5iZD0hMTt0aGlzLkFrPTFFMzt0aGlzLnFhPW51bGw7dGhpcy5EPWQ7dGhpcy5lYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307Zi5vYigibmV3QmlnQWRJZCIpO3RoaXMuRGs9Zi5XKDEwKTsKdGhpcy5vZj0wO3RoaXMuJGM9IldlcmJ1bmcgLSBbdGltZV0iO2UmJmUuYWRtZXNzYWdlJiYodGhpcy4kYz1lLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZS5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy4kYz1lLmFkbWVzc2FnZShhKSkpO2UmJiJ0cnVlIj09U3RyaW5nKGUuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy53az1lLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLkpjPXRoaXMuR2Q9ITE7dGhpcy5raD1lJiZlLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChlLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMuZ2U9ITE7dGhpcy5haT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuWms9Zi5XKDEwKTt0aGlzLkdiPWYuVygxMCk7dGhpcy5FYj1mLlcoMTApO3RoaXMuTGg9Zi5XKDEwKTt0aGlzLmNvbmY9e307dGhpcy5TZD0KdGhpcy5OYj10aGlzLnFlPXRoaXMuaGQ9dGhpcy5JZD10aGlzLnJiPXRoaXMua2M9dGhpcy5zaD10aGlzLm5kPXRoaXMuam89dGhpcy50Yj10aGlzLkZiPSExO3RoaXMucGM9W107dGhpcy5hYz17fTt0aGlzLk9tPTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5sZT10aGlzLkNmPXRoaXMuYWY9ITE7dGhpcy5TZT17fX1jLldpPWE7YS5wcm90b3R5cGU9e3RuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgZD10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuJGFdJiZ0aGlzLmNvbmZbdGhpcy4kYV1bYV0mJihkPXRoaXMuY29uZlt0aGlzLiRhXVthXSk7cmV0dXJuIGR9LFpoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkNiJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5QbigpO2YubyhrLm5rLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExlOmZ1bmN0aW9uKGEsZCxlLGMpe3RoaXMudGI9CmU7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuRC5SKXRoaXMub2YrKyxmLm9iKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkQuTmsoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5ELlJhJiZ0aGlzLkQuaXNFbmFibGVkPyh0aGlzLlpoKCksbmV3IFModGhpcyxhLHRoaXMua2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmQsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ELmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmQ/KHRoaXMuWmgoKSxuZXcgUyh0aGlzLGEsdGhpcy5raCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuRC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuTmEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHJjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3JjLkxlKGEsZCxlKX0sNTApfX0sWGU6ZnVuY3Rpb24oYSl7YS5ZYSYmZi50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlNkPXRoaXMuTmI9dGhpcy5uZD0hMTt0aGlzLmI9YTt0aGlzLkluKHRoaXMuYik7dGhpcy5NZyhhKTt0aGlzLnBjPXRoaXMuRGcoYSk7dGhpcy5VaygpfSxNZzpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5IZD10aGlzLktsKGIpKSx0aGlzLk1nKGIucGFyZW50KSl9LERnOmZ1bmN0aW9uKGIpe3ZhciBkPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLAohYnx8IWIucGFyZW50fHxiLnBhcmVudCBpbnN0YW5jZW9mIGF8fChkPXRoaXMuRGcoYi5wYXJlbnQpKSxkLnB1c2godGhpcy50bChiKSkpO3JldHVybiBkfSx0bDpmdW5jdGlvbihhKXt2YXIgZD0iIixlPVtdO2lmKGEmJmEuSSYmYS5JLmdldEF0dHJpYnV0ZSl7ZD1hLkkuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWUucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZS5sZW5ndGgmJihlPWVbMF0pfXJldHVybnthZElEOmQsY3JlYXRpdmVJRDplfX0sS2w6ZnVuY3Rpb24oYSl7dmFyIGQ9W10sZT1bXSxjPVtdLGY9W10saD0iIjtpZihhLkkpe2Q9YS5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5JLmdldEF0dHJpYnV0ZSgiaWQiKSwKZi5wdXNoKGgpKTthLkkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuSS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKWUucHVzaChhLmtiKGRba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZSxhZElkczpmLGFkSWQ6aH19LHBhOmZ1bmN0aW9uKGEpe2EuWWEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZD0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGQ9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoZD1hLmtkLmVycm9yLmNvZGUpKTsKc3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LlNjLmNvZGU6ZD09Ri5ZZC5jb2RlP2YubyhrLlFvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk6KGYuTWUoKSxkPT1GLkpmLmNvZGUmJmYubyhrLkhtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpO2YubyhrLmlsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5RbigpO3RoaXMuVWEoImVtcHR5Iik7dGhpcy5ELnhiJiZmLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMueGIsITApO2JyZWFrO2Nhc2Ugdy5IZi5jb2RlOmYubyhrLndvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuS2YuY29kZTpmLm8oay5Sbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpOwpicmVhaztjYXNlIHcuWmQuY29kZTpmLm8oay5Tbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlZkLmNvZGU6Zi5vKGsuSW0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6Zi5vKGsuc28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6Zi5vKGsudG8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5VYSgidW5rbm93biIpfXRoaXMuVmIoYSk7dGhpcy5PYSgpfSxWYjpmdW5jdGlvbihhKXt2YXIgZD05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZD1hLmVycm9yLmNvZGUsOTAxPGQmJihkPTkwMCkpO2ZvcihkPQp7IltFUlJPUkNPREVdIjpkfTthLkxhLmxlbmd0aDspdHJ5e3ZhciBlPWEuTGEucG9wKCk7dGhpcy5LZShlLnVybCxlLnR5cGUsZCl9Y2F0Y2goYyl7fX0sSW46ZnVuY3Rpb24oYSl7dGhpcy5xZT0hMTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZD05OTk5O3RoaXMuY29uZi56SW5kZXgmJihkPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5lYi56SW5kZXg9ZDtkPXRoaXMuYS5BO3RyeXt2YXIgZT10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKTtpZihlJiZlLmVudnZhcnMpdHJ5e2Q9ZS5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuYWY9ITB9Y2F0Y2goYyl7fX1jYXRjaChoKXt9ZC5WcD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZC5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmCihkLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZkLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLndrJiZ0aGlzLnBsYXllci52ZSgpJiYoZC52b2x1bWU9dGhpcy5wbGF5ZXIudmUoKS8xMDApO2Zvcig7ZC5maXJzdENoaWxkOylkLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCk7Zm9yKGU9MDtlPGEuTC5sZW5ndGg7ZSsrKWQuY2FuUGxheVR5cGUoYS5MW2VdLnR5cGUpJiZ0aGlzLnJrKGQsYS5MW2VdLnVybCsiIixhLkxbZV0udHlwZSk7dGhpcy5hZiYmZC5sb2FkKCk7aWYodGhpcy5WaChkKSl7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dGhpcy51ayhkKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5xYT10aGlzLmViLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLmFmP3RoaXMudmlkZW89ZDp0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCl9Y2F0Y2gobCl7dGhpcy52aWRlbz1kfX1lbHNlIHRoaXMuYi5WaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnFhPXRoaXMuZWIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGQpLHRoaXMuR24oKSk6dGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0sCkduOmZ1bmN0aW9uKCl7dGhpcy5DZj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5hLmMucmEmJnRoaXMuYS5jLnJhKCkmJihmLm8oay5tZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMucmI9ITApO2YucGUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4udGEmJmYudmsodGhpcy5iLm9yaWdpbi50YSk7dGhpcy5NaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS50aCgpO3RoaXMuYS5tZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEubWYoKTt0aGlzLmViPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYubGYodGhpcy5lYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnFhPQp0aGlzLmEuSDt0aGlzLmZpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7Zi5vKGsud2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX10aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5CLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuQi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTsKdGhpcy5hLkguYXBwZW5kQ2hpbGQodGhpcy5CKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmYubGYodGhpcy5CLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5CLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLk5sKCksYz10aGlzLmIudi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5hLkguc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZi5pYSh0aGlzLkIsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmlhKHRoaXMuQiwiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5pYSh0aGlzLkIsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuaWEodGhpcy5CLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1mLmNnKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5EKTt0aGlzLkIuc3JjPWE7Zi5pZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYS5ZYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5wYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsKIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5FbyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLkZvKCksdGhpcy5hLlliKCEwKSwhdGhpcy5OYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5OYj17ZWw6dGhpcy5CLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07Zi5HZSh0aGlzLk5iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJgoodGhpcy5hLlliKCEwKSx0aGlzLkpvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5ZYighMCksdGhpcy5ObygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5MbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5NbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLktvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmtpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5iLlRiKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2YubyhrLmxnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7CnRyeXtpZih0aGlzLkQuY2R8fHRoaXMuUWMpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuSW8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmYubyhrLmVlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuR28oKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmRjKCkpLHRoaXMuSG8oKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5yYj0KITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLktiKCJtdXRlZCIsInVzZXIiKSxmLm8oay53ZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKToodGhpcy5yYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksZi5vKGsuZWUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9fS5iaW5kKHRoaXMpKTtmLmllKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO2YuaWUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmEuJGYoZnVuY3Rpb24oYSl7Zi5pYSh0aGlzLkIsCiJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sR286ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2YubyhrLmJlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmtjPSEwfSxIbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5rYz0hMX0sSm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtmLm8oay5YZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxJbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTsKZi5vKGsuV2YsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sRm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5OaCgpO2YubyhrLlNmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE5vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2YubyhrLlljLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMubmQ9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2YubyhrLlBmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE1vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLlZhKCJtaWRwb2ludCIpO2YubyhrLlVmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpOwp0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7Zi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sS286ZnVuY3Rpb24oKXt0aGlzLnlmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sa2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5CJiZ0aGlzLkIucGFyZW50Tm9kZSYmdGhpcy5CLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGQ9dGhpcy5CLnBhcmVudE5vZGU7dGhpcy5CLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5CKTtkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7Zi5wZSgpO3RoaXMuQj0hMTt0aGlzLk9hKGEpfX0sRW86ZnVuY3Rpb24oYSl7dmFyIGQ9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshZCYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoZD1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csZC5tYXRjaChjKSk7dGhpcy5VYSgidnBhaWRlcnJvciIpOwpmLm8oay5Qbyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMua2koITApfSxyazpmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIGMoYSxiKXtpZihiLlJhJiZiLmlzRW5hYmxlZCYmIWIuRmMoKSl7dmFyIGQ9Yi5zYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zy5zcmM9YyhkLHRoaXMuRCk7Zy5vbmVycm9yPXRoaXMuQm8uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGcpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhkLHRoaXMuRCkpfSxWaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sdWs6ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuQWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy56Zi5iaW5kKHRoaXMpKX0sQ2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuZ2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuaGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxnaTpmdW5jdGlvbihhKXt0aGlzLlVifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAp0aGlzLkFmKGEpfS5iaW5kKHRoaXMpLHRoaXMuQWspKX0sQWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmQmJnRoaXMuVmgodGhpcy52aWRlbykmJiF0aGlzLkZiJiYhdGhpcy5VYil7dGhpcy5iZD0hMDt0cnl7aWYoIWYuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRmJ8fCh0aGlzLkZiPSEwLHRoaXMuQ2QodGhpcy52aWRlbyksZi50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuRC50Z3x8dGhpcy5ELmVhKCJ2aWRlby1ub29wIikpO3RoaXMuT2EoKTtyZXR1cm59fWNhdGNoKGQpe2YudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMueW8oKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYS5tZigpO3RoaXMueG8oKTt0aGlzLmZpKCk7dGhpcy5kZygpO3RoaXMuYS50aCgpO3RoaXMudmlkZW8ucGxheSYmCnRoaXMucGYoKX19LHBmOmZ1bmN0aW9uKCl7dGhpcy5oZHx8dGhpcy5RZigpfSxRZjpmdW5jdGlvbihhKXt2YXIgZD10aGlzLnZpZGVvLnBsYXkoKTtpZihkJiZkWyJjYXRjaCJdKWRbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLmhkfHwoYT90aGlzLk9hKCk6KHRoaXMuUWUoITApLHRoaXMuUWYoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5iYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmJjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5nZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGYoKSl9LmJpbmQodGhpcyk7dGhpcy54ZSgpLkloKHRoaXMpfSx5ZjpmdW5jdGlvbigpe3RoaXMuRC5qYiYmIXRoaXMuRmImJihmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5vKGsubGssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLk9hKCl9LG9rOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD1bXSxjPSExLGc9MDtnPGEubGVuZ3RoO2crKyljPWYuSGcoYVtnXSksZC5wdXNoKGMpO2E9e2hhc2hlczpkfTthPWsuUWEoYSx0aGlzLnUoKSk7Zi5NbihhKX0sT2E6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuVGQmJnRoaXMub2sodGhpcy5iLlRkKTtpZighdGhpcy5xZSlpZih0aGlzLnFlPSEwLHRoaXMuU2R8fChmLm8oay5LbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5zYnx8dGhpcy5iLm5jKXtmLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLm9mKys7dGhpcy5VYj10aGlzLmJkPSExO3RyeXt0aGlzLkNkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuZWIucmVtb3ZlQ2hpbGQodGhpcy5xYSl9Y2F0Y2goZyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuR2Q9ITE7dHJ5e3RoaXMuYS5jaSgpfWNhdGNoKGgpe310aGlzLklkPSEwO3RoaXMuYS5CZSgpO3RoaXMuWmI9ITE7dGhpcy54ZSgpLkRoKCk7dGhpcy5iLnNiJiZ0aGlzLmIub3JpZ2luLlJlKCk7dGhpcy5iLm5jJiYoYT90aGlzLmIub3JpZ2luLm9oKCk6dGhpcy5yZSgpKX1lbHNlIHRoaXMucmUoKX0sQm86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnpmKGEpKX0semY6ZnVuY3Rpb24oYSl7dGhpcy5VYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkQuS2soKTsKdGhpcy5iLm9yaWdpbi51Zyh3LlZkKX0saGk6ZnVuY3Rpb24oKXtpZih0aGlzLmpvKXRoaXMuT2EoKTtlbHNle3RoaXMuWmI9ITA7dGhpcy5hLmMueGEmJiF0aGlzLklkJiZ0aGlzLmEuYy54YSgpJiZmLm8oay53Yyx0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tbyhhKTtpZighdGhpcy5OYil7dmFyIGQ9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk5iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5TZD0hMDtmLm8oay5paSx0aGlzLmIudix0aGlzLmEuYy5sKCksCnRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpkLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuR2UodGhpcy5OYil9Yz0iIjt0aGlzLmIubmYmJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGgpKSYmKGM9dGhpcy5iLm5mLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkdkfHwodGhpcy5HZD0hMCxkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay5XZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuYi5zYj8odGhpcy5VYj10aGlzLmJkPSExLHRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5xYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmViLnJlbW92ZUNoaWxkKHRoaXMucWEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuR2Q9ITEsdGhpcy5hLmNpKCksdGhpcy5iLm9yaWdpbi5SZSgpKTp0aGlzLk9hKCl9LmJpbmQodGhpcykpKSksZC5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLiRjLnJlcGxhY2UoIlt0aW1lXSIsZi5DZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLmdlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSwkaDpmdW5jdGlvbigpe3RoaXMuc2h8fCh0aGlzLnNoPSEwLHRoaXMubmR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtbzpmdW5jdGlvbihhKXtmLm8oay5lZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2E9PXRoaXMuYWl8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy50YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50YiksdGhpcy50Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkQueGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLnhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuJGgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLiRoKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuTmgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuRC5qYiYmdGhpcy5WYSgic3RhcnQiKSxmLm8oay5TZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpLGYubyhrLlhmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLm5kPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsuUGYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkQuamImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5VZix0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5ELmpiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5WYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsuWWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksdGhpcy5haT1hKX0sTWg6ZnVuY3Rpb24oYSxkKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGQsITApfSxQbjpmdW5jdGlvbigpe2YuTmQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sTmg6ZnVuY3Rpb24oKXtmLk5kKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFFuOmZ1bmN0aW9uKCl7Zi5OZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFVhOmZ1bmN0aW9uKGEpe2YuTmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMuQ2Z8fHRoaXMuRC5qYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxLYjpmdW5jdGlvbihhLGQpe3RoaXMuRC5qYiYmZi50cmFjaygic3RhdHNfaGRfIithLGQsITApfSx0cmFjazpmdW5jdGlvbihhLGQpe2lmKCF0aGlzLkZiKXt0aGlzLlNlJiYKdGhpcy5TZS50cmFjayYmdGhpcy5TZS50cmFjayhhKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5MbCh0aGlzLmIuTGEsYSl9Y2F0Y2goZyl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmxlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSGQuaW1wcmVzc2lvbnMmJmYuaG0oaC51cmwsdGhpcy5IZC5pbXByZXNzaW9ucyk/dGhpcy5LZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7Zi5vKGsubWssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuSGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChkKXt9fS5iaW5kKHRoaXMpKToKdGhpcy5LZShoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZCl0cnl7dGhpcy5iLkxhPXRoaXMuY2wodGhpcy5iLkxhLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWYuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsZD0iIjt0aGlzLkNmJiYoZD0iX3ZwYWlkIik7dGhpcy5RYyYmKGQ9Il93ZWxlY3QiKTtyZXR1cm4gYStkfSxLZTpmdW5jdGlvbihhLGQsYyxnLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihkPXRoaXMuRC53YShhKSxjJiZkLnFrKGMpLGd8fChnPXRoaXMuc2cpLGZ8fChmPXRoaXMuc2cpLHRoaXMuc2soYSksdGhpcy5ELkhhKGQsZnVuY3Rpb24oKXt0aGlzLkNoKGEpO2coKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2goYSk7ZigpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHNrOmZ1bmN0aW9uKGEpe3RoaXMuYWNbYV09Im9wZW4ifSxDaDpmdW5jdGlvbihhKXt0aGlzLmFjW2FdPSJjbG9zZWQifSxVazpmdW5jdGlvbigpe3RoaXMuYWM9Cnt9fSxTbjpmdW5jdGlvbigpe3ZhciBhPTAsZDtmb3IoZCBpbiB0aGlzLmFjKXRoaXMuYWMuaGFzT3duUHJvcGVydHkoZCkmJiJvcGVuIj09dGhpcy5hY1tkXSYmYSsrO3JldHVybiBhfSxMbDpmdW5jdGlvbihhLGQpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1kfSl9LGNsOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1kfSl9LHlvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy56by5iaW5kKHRoaXMpKX0sem86ZnVuY3Rpb24oKXtmLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmRjKCk6dGhpcy5iLlRiJiYoZi5vKGsubGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO2lmKHRoaXMuRC5jZHx8dGhpcy5RYylhPSJfYmxhbmsiO3RyeXt2YXIgZD13aW5kb3cub3BlbigiIixhKTtkLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7ZC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYi5UYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIuVGIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSx4bzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy4kYy5yZXBsYWNlKCJbdGltZV0iLGYuQ2coMCkpO3ZhciBkPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuRC5kZCYmKGQ9dGhpcy5ELmRkKTtkJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmQpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuRC5kZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkQuZGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbihhKXtpZighZi5xZih0aGlzLmNvbnRyb2xzKSl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuWms7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuR2I7Zy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk6KGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLldoLmJpbmQodGhpcykpLGQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuV2guYmluZCh0aGlzKSkpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZGMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkViO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubG8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkxoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZyk7dGhpcy5iLm5mJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoaCk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtmLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmRjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoYyk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZC5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmQuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGQpO3RoaXMuYS4kZihmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGYubyhrLm1nLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5RZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGRjOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkRmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsuWWMsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMua2M/KGYuaWEodGhpcy5CLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZi5pYSh0aGlzLkIsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5vKGsuYmUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LEZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLm8oay5ZYyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LGtvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxsbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGYuaWEodGhpcy5CLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGYuaWEodGhpcy5CLCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGYubyhrLndkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxvbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZi5vKGsudmYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LGJjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYmMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmJjKTt0aGlzLmhkfHx0aGlzLmdlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5wZigpKX0scmU6ZnVuY3Rpb24oKXt0aGlzLnFtKCkmJnRoaXMucG0oKSYmKHRoaXMuRC5WY3x8InNwaWVnZWwuZGUiPT1mLlhiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1mLkNiJiZ0aGlzLm5vKCl8fCh0aGlzLmhkPSEwLHRoaXMudGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGIpLHRoaXMudGI9ITEpLHRoaXMubmcoKSl9LHFtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5sZCgpO3JldHVybiB0aGlzLkQuamMmJiFmLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZD1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9Zi5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuSmN8fChhPSEwLGQuYWRGYWxsYmFja1VSTHx8KGQuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMubGUmJmQuYWRGYWxsYmFja1VSTCkmJiF0aGlzLkpjfSxBbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxkPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1kLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sbm86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpO3RoaXMuSmM9dGhpcy5RYz10aGlzLkRmPSEwO2YudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLmxlPSEwO3ZhciBhPXRoaXMuQWwoKSxhPWYuY2coYSx0aGlzLkQsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLkxlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LG5nOmZ1bmN0aW9uKGEpe3RoaXMuU24oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCEwKX0uYmluZCh0aGlzKSx0aGlzLk9tKToodGhpcy5JZD0hMCx0aGlzLmEuQmUoKSx0aGlzLmEucW4oKSx0aGlzLlpiPSExLGYubyhrLllrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy54ZSgpLkRoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxkZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRWEoIm1pblZpcyIpO2EmJihmLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5GaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuVGIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuc2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5wYyYmMDx0aGlzLnBjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5wYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5EaysiLSIrdGhpcy5vZjt0aGlzLmImJnRoaXMuYi5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5XaXx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5XbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMuV2x8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGUpe3RoaXMub3B0aW9ucz1lfHx7fTtkPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlU9W107dGhpcy5JPW51bGw7dGhpcy5vYz10aGlzLnFjPSExO3RoaXMudGE9IiI7dGhpcy5CZj0hMTt0aGlzLlRnPSIiO2UmJmUuZW1wdHk/dGhpcy55bSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGQsZT1bXTtjLlRqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLmxkKCksYjtiPWYuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBkPSIiO2IucXVlcnlLZXkmJihkPWIucXVlcnlLZXkuaHZwKTtkJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTpsLndhKGwuSmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZi5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9Zi5wZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fAoiYXBwc3BvdCI9PWR8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5KZChhKSkrIiZ0eXBlPWpzIixiPWwud2EobC5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC53YShsLkpkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMueG0uYmluZCh0aGlzKSwKdGhpcy51bS5iaW5kKHRoaXMpKX0sRWc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMubWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkNiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChlKXtkW2JdPQp7fX1lbHNlIGQuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZD1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5DYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuQ2J8fHRoaXMubm0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuWG4oKSl0cnl7dmFyIGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWUubGVuZ3RoJiYoZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKwooYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZVswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGQ7ZC5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sbm06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJgpiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9jPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGM9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSx4bTpmdW5jdGlvbihhKXt0aGlzLlptKGEpO3RyeXt0aGlzLm1hPWEucmVzcG9uc2VYTUwsdGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5QYSh3LlpkKSl9dGhpcy5VPXRoaXMuRWcoKTt0aGlzLnFjPXRoaXMucmYoKTsKdGhpcy5vYz10aGlzLlNoKCk7dGhpcy5UZz1hLnVybENhbGxlZDt0aGlzLlUubGVuZ3RoP3RoaXMuSWMoKTp0aGlzLnBhKHRoaXMuUGEody5TYyx7ZXJyb3I6dGhpcy5CZj9GLllkOkYuSWZ9KSl9LHltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuUGEody5aZCkpfXRoaXMuVT10aGlzLkVnKCk7dGhpcy5xYz10aGlzLnJmKCk7dGhpcy5vYz10aGlzLlNoKCk7dGhpcy5VLmxlbmd0aD90aGlzLkljKCk6dGhpcy5wYSh0aGlzLlBhKHcuU2Mse2Vycm9yOnRoaXMuQmY/Ri5ZZDpGLklmfSkpfSx1bTpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5QYSh3LkhmLHtkZXB0aDpifSkpfSxJYzpmdW5jdGlvbigpe3RoaXMuST10aGlzLlUuc2hpZnQoKTt0aGlzLnJtKCk/dGhpcy5mbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLk5nKCksZCx7QWRTeXN0ZW06dGhpcy5zbCgpLAp2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLlBhKHcuS2YpKTooYj0wLHRoaXMucW8oKSYmdGhpcy5YZSh0aGlzLmFsKCkpKX0sUmU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5VLmxlbmd0aCx0aGlzLlUubGVuZ3RoJiZ0aGlzLkljKCkpOnRoaXMucGFyZW50LlJlKCl9LG9oOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuVS5sZW5ndGgsdGhpcy5VLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5vaCgpfSxxbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvKCk/dGhpcy5hbygpPyEwOigtMSE9dGhpcy5BYygpP3RoaXMucGEodGhpcy5QYSh3LlVkKSk6dGhpcy5wYSh0aGlzLlBhKHcuRWYpKSwhMSk6KHRoaXMucGEodGhpcy5QYSh3LlNjLEYuSmYpKSwhMSl9LFhlOmZ1bmN0aW9uKGEpe3RoaXMudGF8fCh0aGlzLnRhPSIiKTthLlRkfHwoYS5UZD1bXSk7YS5UZC5wdXNoKHRoaXMuVGcpO2EuTGE9YS5MYS5jb25jYXQodGhpcy5OZSgpKTsKYS5zYj1hLnNiP2Euc2I6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZzt0aGlzLnBhcmVudC5YZShhKX0sYWw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuZHVyYXRpb249dGhpcy5BYygpO2EuTD10aGlzLktnKCk7YS5UYj10aGlzLnZsKCk7YS5icT1bXTthLm9yaWdpbj10aGlzO2Eudj10aGlzLnJsKCk7YS5uZj10aGlzLkpsKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztyZXR1cm4gYX0scGE6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLnRhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5BZztpZighdGhpcy5JJiZ0aGlzLm1hJiYKdGhpcy5tYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuST10aGlzLm1hO3RyeXtpZih0aGlzLkkmJnRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGQ9ITE7KGQ9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZC5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChjKXt9fXRoaXMuSSYmKGEuTGE9YS5lcnJvci5jb2RlIT13LlVkLmNvZGU/YS5MYS5jb25jYXQodGhpcy53bCgpKTphLkxhLmNvbmNhdCh0aGlzLkZsKCkpKTt0aGlzLlUubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5WYiYmdGhpcy5wYXJlbnQuVmIoYSksYj0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShhKSxiPTApfSxWYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WYihhKX0sCnVnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLlBhKGEsYikpfSxQYTpmdW5jdGlvbihhLGIpe3ZhciBkPW5ldyBUYShhLGIpO2Qub3JpZ2luPXRoaXM7cmV0dXJuIGR9LGZvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZH0sYm86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxhbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuQWMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlUuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxTaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVSYmMjw9dGhpcy5VLmxlbmd0aCYmIXRoaXMucmYoKSYmKGE9ITApO3JldHVybiBhfSxabTpmdW5jdGlvbihhKXt0aGlzLnRhPSJVTktOT1dOIjt0cnl7ZS5wdXNoKHRoaXMudGE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy50YT0KIlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGQpe319LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLkksIlZBU1RBZFRhZ1VSSSIpfSxzbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuSSwiQWRTeXN0ZW0iKX0sTmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXTtbXS5zbGljZS5jYWxsKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5haChhKSl7dmFyIGQ9CmEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxjLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmQsdXJsOnRoaXMua2IoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LEZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHdsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxLZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZD0wO2Q8CmEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxOYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2RdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksd3A6YVtkXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMua2IoYVtkXSl9KTt2YXIgYz10aGlzLm9wdGlvbnMuTmF8fDFFMzt0cnl7dmFyIGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoYy1hLk5hKS1NYXRoLmFicyhjLWIuTmEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhjLWEuTmEpLU1hdGguYWJzKGMtYi5OYSl9KSwKYj1lLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHJsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGQ9ITEsYz1bXSxiPSExLGU9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZT1iPXRoaXMucGQoYVtoXSk7dHJ5e2Q9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtkPWJ9Yy5wdXNoKGQpO2YucHVzaChlKX0xPGEubGVuZ3RoPyhiPWMsaD1lKTooYj1kLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEFjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5JLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqCithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxjPSExO3RyeXtkPXRoaXMuSS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sYz1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5MbihjLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGUpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0semU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucGQoYSk6IiJ9LHBkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuemUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5Uanx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLmFtfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLkxhPVtdO3RoaXMuTD1bXTt0aGlzLlRiPSIiO3RoaXMudj10aGlzLm5jPXRoaXMuc2I9ITE7dGhpcy5DZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuRGU9IiJ9Yy5Baj1hO2EucHJvdG90eXBlPXtWazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxkPTA7ZDx0aGlzLkwubGVuZ3RoO2QrKylpZigwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxEbDpmdW5jdGlvbigpe2lmKCF0aGlzLkNlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubWEpe3ZhciBhPXRoaXMub3JpZ2luLm1hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZD0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGQ9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1kLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLkNlPWFbY10pfXJldHVybiB0aGlzLkNlfSxJZzpmdW5jdGlvbigpe2lmKHRoaXMuRGUpcmV0dXJuIHRoaXMuRGU7dmFyIGE9IiI7KGE9dGhpcy5EbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuRGU9YX0sTmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZD0wO2Q8dGhpcy5MLmxlbmd0aDtkKyspaWYoMDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLkxbZF0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5MW2RdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTFtkXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLkxbZF07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLkFqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLk1tfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e1pkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLEthOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsS2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLEthOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxIZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixLYToiTE9BRF9FUlJPUiJ9LFZkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixLYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LApXbzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixLYToiTUVESUFGSUxFX0VSUk9SIn0sVWQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsS2E6IkRVTU1ZX0FEIn19LEY9e0lmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsS2E6Ik5PX0FEUyJ9LEpmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixLYToiTk9fTUVESUFGSUxFUyJ9LFhvOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLEthOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sWWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsS2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFdhPWMuSGp8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5lcnJvcj1hO3RoaXMua2Q9ZDt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuTWl8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5yaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMucml8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5FaD1hO3RoaXMudmlkZW89ZDt0aGlzLlFkPVtdO3RoaXMuQmg9W107dGhpcy5UZT1bXTt0aGlzLkFvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSigpfWMuWW89YTthLnByb3RvdHlwZT17SjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5FaC5sZW5ndGg7YSsrKXt2YXIgZD10aGlzLkVoW2FdLGM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suUnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLm1uLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmRuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1jO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5RZC5wdXNoKHtzcmM6YyxmcmFtZTpoLFBtOmYsdmVuZG9yOmQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPTA7ZDx0aGlzLlRlLmxlbmd0aDtkKyspe3ZhciBjPXRoaXMuVGVbZF07Yy50eXBlPT09YSYmYy5Gayh0aGlzLnhsKGEpKX19LAp4bDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOnskcDohMCxacDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntOcDoidmlkZW8iLGNxOiJqc0N1c3RvbSIsZXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxmcToxLHhwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sCk1sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZD0wO2Q8dGhpcy5RZC5sZW5ndGg7ZCsrKWlmKHRoaXMuUWRbZF0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5RZFtkXS5QbTtyZXR1cm4iIn0sbW46ZnVuY3Rpb24oYSxkKXt0aGlzLkJoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLk1sKGQpLHZlbmRvcjpkfSk7dGhpcy5ObigpfSxkbjpmdW5jdGlvbihhLGQpeyJ2aWRlbyI9PT1hP3RoaXMuQW8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuYWcoYSxkKX0uYmluZCh0aGlzKSk6dGhpcy5hZyhhLGQpfSxhZzpmdW5jdGlvbihhLGQpe3RoaXMuVGUucHVzaCh7dHlwZTphLEZrOmQsWHA6ITF9KX0sTm46ZnVuY3Rpb24oKXt0aGlzLkJoLm1hcChmdW5jdGlvbihhKXthLmttfHwoYS5RcCh7YWRTZXNzaW9uSWQ6Zi5XKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5hcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmttPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuRml8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZCl7dGhpcy5jb25mPWR8fHt9O3RoaXMuYz1hO3RoaXMuaWI9YS5GZygpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9Zi5XKDEwKTt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5NYT17fTt0aGlzLmJnPSExOwp0aGlzLlJiPVtdfWMuSmk9YTthLnByb3RvdHlwZT17cWw6ZnVuY3Rpb24oYSl7dmFyIGQ9e30sYz0hMSxmPTAsZD0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9ZC5sZWZ0LGQ9ZC50b3ApO2g9e3g6Zix5OmR9O2gucG9zaXRpb249YztyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5xbChhKTtmb3IodmFyIGQ9MCxjPTAsZj0hMSxoPXRoaXMuVWwoYSksaz17fTthOylkKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGMrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKZCs9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpkLHk6Y307ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LFZuOmZ1bmN0aW9uKCl7dGhpcy5iZz0hMH0sY2k6ZnVuY3Rpb24oKXt0aGlzLkE9Qy5wb3AoKTt0aGlzLkF8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHRoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsud2MsdGhpcy5jLmwoKSl9LHFuOmZ1bmN0aW9uKCl7dGhpcy5iZ3x8Cih0aGlzLmMucGxheSgpLGYubyhrLmdkLHRoaXMuYy5sKCkpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuaWIuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmliKTsKdGhpcy5jLk1jJiZ0aGlzLmMuTWMoKT90aGlzLmMuRmcoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlliLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxVbDpmdW5jdGlvbihhKXtmb3IodmFyIGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGQmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7Yz0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sb2w6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5nZXRQb3NpdGlvbihhKTtkLnBvc2l0aW9uP2QucG9zaXRpb249ZC5wb3NpdGlvbjpkLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC53aWR0aD1hLm9mZnNldFdpZHRoO2QuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gZH0sWWI6ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5vbCh0aGlzLmliKTtpZihkLnghPXRoaXMuTWEueHx8ZC55IT10aGlzLk1hLnl8fGQucG9zaXRpb24hPXRoaXMuTWEucG9zaXRpb258fGQud2lkdGghPXRoaXMuTWEud2lkdGh8fGQuaGVpZ2h0IT10aGlzLk1hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk1hLndpZHRoJiYwPHRoaXMuTWEuaGVpZ2h0JiYwPT1kLndpZHRoJiYwPT1kLmhlaWdodCl7dGhpcy5CZSgpO3JldHVybn10aGlzLk1hPWQ7dGhpcy5jLk1jKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD1kLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWQueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZC5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZC5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9ZC53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWQuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuUmIubGVuZ3RoO2ErKyl0aGlzLlJiW2FdKHt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodH0pfWYucWYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5ZYi5iaW5kKHRoaXMpLDEwKX0sJGY6ZnVuY3Rpb24oYSl7dGhpcy5SYnx8KHRoaXMuUmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlJiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuSml8fFphLEM9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPQpmLlcoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLktpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy5LaXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlMoYik7dGhpcy5EZChhKTt0aGlzLnFnKCl9LERkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxxZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHhhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxFZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZD10aGlzLkZhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYmI9Yy50anx8YmI7KGZ1bmN0aW9uKGMpe2Muc2o9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5RYj10aGlzLlFifHwhMTt0aGlzLlRmPXRoaXMuVmY9CnRoaXMuWGc9dGhpcy5iYT10aGlzLnVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMubWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVmPSEwO3RoaXMuWGcmJnRoaXMua2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuZWQoKTt0aGlzLlhnPSEwO3RoaXMua2coKX0uYmluZCh0aGlzKSk7CnRoaXMuZmcoKX0sa2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5lZCgpO2lmKCF0aGlzLnVmJiYhdGhpcy5lZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudWYmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0sZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LExnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGQ9MDtkPGIubW9kdWxlcy5sZW5ndGg7ZCsrKXt2YXIgYz1iLm1vZHVsZXNbZF07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5lZCgpKXt2YXIgYT0KdGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlZmPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9YS51cH10aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLkxwKCk6ITF9LEFjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5BYygpOi0xfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxtbDpmdW5jdGlvbihhLGIpe3RoaXMuUWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmJhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksMTAwKX0sZmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6YS5FZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkdsKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuc2p8fGNiOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbW06ZnVuY3Rpb24oKXt3aW5kb3cuT08uRWouamsuaGs/d2luZG93Lk9PLkVqLmprLmhrLnNwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLnllKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBkPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgY2IoZCx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMudWp8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmdsfHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQ2k9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLk9nKCl9LE9nOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5TKGEpLHRoaXMuVihiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9nKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLndoKCl9LHdoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5UJiYoMCx0aGlzLlQpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5DaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuQmk9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0saGc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMucygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuaGcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuQml8fGhiOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0semg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5qYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk0oYSksKG5ldyBoYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLm5sfHwodGhpcy5ubD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuemgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLnpoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuRGl8fGliLFQ9bmV3IGliKHIpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5abD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuWmx8fGpiO25ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLk9qPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkouYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE1jOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5Panx8VTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlpjKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5zLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguWmMoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5MbShhKX0uYmluZCh0aGlzKSk7eC5aYygiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt4LlpjKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7eC5RbCgpfSxMbTpmdW5jdGlvbihhKXt2YXIgYj0iIixkO2ZvcihkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSl7Yj1pc05hTihhW2RdKT8hMTphW2RdO2lmKDEwMDk9PWFbZF18fDEwMDE9PWFbZF18fDMwMz09YVtkXXx8NDAzPT1hW2RdKXt0aGlzLnMoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgYyBpbiBhW2RdKWlmKGFbZF0uaGFzT3duUHJvcGVydHkoYykmJihiPWlzTmFOKGFbZF1bY10pPyExOmFbZF1bY10sMTAwOT09YVtkXVtjXXx8CjEwMDE9PWFbZF1bY118fDMwMz09YVtkXVtjXXx8NDAzPT1hW2RdW2NdKSl7dGhpcy5zKCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMuTmp8fFY7KGZ1bmN0aW9uKGMpe2MuUGo9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYS5wdXNoKGJbZF0pO3RoaXMueGQmJihhPWYuZGwoYSx0aGlzLnhkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGM9bmV3IFUoYyk7aWYoIXRoaXMuSyhjKSl7dGhpcy5NKGMpOwp2YXIgZz1uZXcgVihjLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGQ9YVtiXTtkLnBhcmVudEVsZW1lbnQ7KXt2YXIgZD1kLnBhcmVudEVsZW1lbnQsaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueGR8fCh0aGlzLnhkPVtdKSx0aGlzLnhkLnB1c2goYVtiXSksYz1uZXcgVShoKSx0aGlzLksoYyl8fCh0aGlzLk0oYyksZz1uZXcgVihjLHRoaXMuRiksZy5mKCkpfWNhdGNoKGspe319fXRoaXMuTygpfSxaYzpmdW5jdGlvbihhLGIsZCl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGQpfSxobzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLkhjfHwKKHRoaXMuSGM9W10pLHRoaXMuSGMucHVzaChhKSx0aGlzLnBuKCkmJih0aGlzLmRmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bZF0mJjA8dGhpcy5hYVtiXVtkXS5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmFhW2JdW2RdLmxlbmd0aDtjKyspdGhpcy5hYVtiXVtkXVtjXShhKX19LFFsOmZ1bmN0aW9uKCl7aWYodGhpcy5IYylmb3IodmFyIGE9MDthPHRoaXMuSGMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IY1thXSxkPWIuc1BsYXllclNlbGVjdG9yLGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbZF1bY10mJjA8dGhpcy5hYVtkXVtjXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmFhW2RdW2NdLmxlbmd0aDtmKyspdGhpcy5hYVtkXVtjXVtmXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4LmhvKGEpfX0pfSkoYyk7dmFyIGtiPWMuUGp8fGtiLHg9bmV3IGtiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGI9Yy5YbHx8bGI7bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueWk9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVihiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0seGE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLnlpfHxtYjsoZnVuY3Rpb24oYyl7Yy56aT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy56aXx8Cm5iOyhmdW5jdGlvbihjKXtjLkFpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxlPSIiO3RyeXtlPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2U9Yy5pZH1pZihlJiYkKCIjIitlKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZSk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5JYSlpZihiPT10aGlzLklhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5JYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuQWl8fG9iLHBiPW5ldyBvYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLkdpfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyYmdGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2EmJihiPWEpO3RoaXMuUyhhKTt0aGlzLlYoYik7dGhpcy5jbih0aGlzLmdldFJhd1BsYXllcigpLAphKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sY246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5wYXVzZSYmdGhpcy5mYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEudW5tdXRlJiZ0aGlzLmZhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sWWc6ZnVuY3Rpb24oYSl7dGhpcy5mYT1hfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5xanx8cmI7KGZ1bmN0aW9uKGMpe2MucGo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLmxpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLmxpJiYodGhpcy5DKCksdGhpcy5saT0hMCx0aGlzLmthKCkpO2IuRmEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBzYj1jLnBqfHxzYjsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZT0wO2U8YS5sZW5ndGg7ZSsrKWM9bmV3IHJiKGFbZV0pLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLnJqfHx0YixXPW5ldyB0YihyKTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLnhrfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuJGo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKSmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlQ/KDAsdGhpcy5UKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy4kanx8dmI7KGZ1bmN0aW9uKGMpe2MuWmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGFuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9CltdKTt0aGlzLmFiLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5vYSgpOnRoaXMubSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMuYW4odGhpcy56YSk6KHRoaXMuemE9dGhpcy5DYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkMoKTsKcmV0dXJufWlmKCF0aGlzLnJjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmFiJiZ0aGlzLmFiLmxlbmd0aCYmMTx0aGlzLmFiLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuYWIubGVuZ3RoLTE7YisrKTEwMDkhPXRoaXMuYWJbYl0mJjMwMyE9dGhpcy5hYltiXSYmNDAzIT10aGlzLmFiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLnMoImVtcHR5IiksdGhpcy5vYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5aanx8d2I7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpOwp0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLk0oYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy5ha3x8eGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51aT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMudWl8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkpqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGEpO3RoaXMuVihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlllPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuVG0oKX0uYmluZCh0aGlzKSw1MDApfSxUbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlQmJnRoaXMuVCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlllJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlllKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFJuOmZ1bmN0aW9uKCl7dGhpcy5ZZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuSmp8fEFiOyhmdW5jdGlvbihjKXtjLklqPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5pYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5CbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5CbT8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuUm4oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBCYj1jLklqfHxCYjsoZnVuY3Rpb24oYyl7Yy5Laj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuS2p8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLkVtfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxKYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5Hanx8RmI7KGZ1bmN0aW9uKGMpe2MuRmo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YT10aGlzLnliKCk7MDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5zbSgpOnRoaXMuamcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSxXazpmdW5jdGlvbigpe3RoaXMuUmYoKXx8dGhpcy5pKCEwKX0sc206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnliKCk7IWEubmEmJmEuVSYmYS5ycCYmYS50cCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LGpnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55YigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jPyh0aGlzLnMoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0seWI6ZnVuY3Rpb24oKXtpZighdGhpcy5yaClmb3IodmFyIGE9Yy5UYy55YigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1iJiYodGhpcy5yaD1hW2RdKTtyZXR1cm4gdGhpcy5yaH0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz8KYT90aGlzLnliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEdiPWMuRmp8fEdiOyhmdW5jdGlvbihjKXtjLlRjPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sTWs6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuVGMueWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLk1rKGFbYl0pO3RoaXMuTygpfX0pO2MuVGMueWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPQpbXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1iW2NdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLlRjfHxIYixJYj1uZXcgSGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy53aXx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5TKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj8KdGhpcy5WKGIpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LEtwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5YYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sCk1jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEZhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6YT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLm5qfHxYOyhmdW5jdGlvbihjKXtjLm1qPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlplPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMuWmU9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5aZSYmYyE9dGhpcy5aZXx8CiJhZGVycm9yIiE9YS5ldmVudHx8Zi5ZKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5TcCksdGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMubWp8fFk7KGZ1bmN0aW9uKGMpe2Mub2o9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWIubGVuZ3RoLGU9MDtlPGM7ZSsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZV0pKWE9bmV3IFgoYSksYS5qYXx8dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5qYT90aGlzLmRmKCk6dGhpcy5LKGEpfHwodGhpcy5NKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMub2p8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRrPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIE1iPWMuZGt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlVpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5TKGMpLHRoaXMuVihiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSxzbjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSwKeGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LFBwOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuVWl8fE5iOyhmdW5jdGlvbihjKXtjLlRpPXYuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk49dGhpcy5OfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZ2coKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5rYSgpfS5iaW5kKHRoaXMpKX0sZ2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5nZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksCnRoaXMub2EoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5UaXx8T2I7KGZ1bmN0aW9uKGMpe2MuVmk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuamF8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLlZpfHxQYixRYj1uZXcgUGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVqPWE7YS5wcm90b3R5cGU9e319KShjKTsKdmFyIFJiPWMuVWp8fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVihhKTt0aGlzLlMoYil9ZWxzZSB0aGlzLlooKX0sT2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksCmIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxibjpmdW5jdGlvbigpe3RoaXMuUmM9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5SY3x8KHRoaXMuUmM9ITAsdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLk9kKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SYyYmKHRoaXMuT2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SYz0hMSksdGhpcy5PZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSwKeGE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBTYj1jLmZrfHxTYjsoZnVuY3Rpb24oYyl7Yy5laz12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpLAphLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuU2IoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMCl9LFNiOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5raz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmkoKSk6KHRoaXMua2t8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LE5mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9CjA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5TYih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5BaCgpO3RoaXMuTmYoKTt0aGlzLmVuKCl9LGVuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5TYihhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy4kbT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy4kbT0hMDsKaWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5TYihhKSl9fSl9KShjKTt2YXIgVGI9Yy5la3x8VGI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYS5ibigpLGE9bmV3IFRiKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFViPWMuZ2t8fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2I9Yy5Zanx8V2I7bmV3IFdiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMudWg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlMoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5WKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5GbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sCnNuOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZtfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5NZChhKX0uYmluZCh0aGlzKSl9LE1kOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLnVoJiYodGhpcy51aD0hMCx0aGlzLlQmJnRoaXMuVCgpKX19KX0pKGMpO3ZhciBPPWMuUmp8fE87KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0semE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuRGIrKywxNTx0aGlzLkRiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz8KdGhpcy5FbigpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmRhKGEpO3RoaXMuYmF8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTiksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sCmRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk49YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTj10aGlzLk58fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy56YSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFA9Yy5Ranx8UDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5UYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTthLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgUChhLHRoaXMuRiksYS5mKCkpKTt0aGlzLmRmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgWGI9Yy5Tanx8WGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5MaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFpiPWMuTGl8fFpiO25ldyBaYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpO2ImJnRoaXMuUyhiLnBhcmVudE5vZGUpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuamp8fFo7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2c6ZnVuY3Rpb24oYSwKYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLlVnPTA7dGhpcy5OPXRoaXMuTnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmJhPXRoaXMuRWM9dGhpcy56YT10aGlzLmFkPSExO3RoaXMueWg9Zi5IYigxMCk7dGhpcy5kaCgpfSxkaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMucWIoKSwhMDt0aGlzLlVnKys7aWYoMTA8dGhpcy5VZyl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRoLmJpbmQodGhpcyksCjEwMCksITF9LHFiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLAohMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZGEoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk4pO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnZhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTsKaWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiZhW2VdJiZhW2VdLmFkRXJyb3ImJmFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2VdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmE/KHRoaXMucygpLHRoaXMub2EoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJgpiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuaWp8fGFhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLksoYSl8fCh0aGlzLk0oYSksYT1uZXcgYWEoYSx0aGlzLkYpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWih3aW5kb3cucGxheWVyKSx0aGlzLksoYSl8fAoodGhpcy5NKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyICRiPWMua2p8fCRiLGFjPW5ldyAkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBiYz1jLlBsfHxiYztuZXcgYmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5SaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuUyhhKSx0aGlzLlYoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLlJpfHxjYzsoZnVuY3Rpb24oYyl7Yy5RaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pZygpfSxpZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMuUWl8fGRjOyhmdW5jdGlvbihjKXtjLlNpPXQuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuamEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLk0oYSk7KG5ldyBkYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuU2l8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLk5tfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5vaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlMoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuVihhKTp0aGlzLlooKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBoYz1jLm9pfHxoYzsoZnVuY3Rpb24oYyl7Yy5uaT12LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpKTt0aGlzLm5lKCk7dGhpcy5lZygpfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk49YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpiKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMucygiZW1wdHkgdmFzdCIpfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm9hKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5lLmJpbmQodGhpcyksMTAwKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy52YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT8KYS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnMoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgaWM9Yy5uaXx8aWM7KGZ1bmN0aW9uKGMpe2MucGk9dC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBoYyhhKTthLmphP3RoaXMuTygpOnRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGljKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuUWEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgamM9Yy5waXx8amMsa2M9bmV3IGpjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Vbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxjPWMuVW98fGxjO25ldyBsYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuY2Y9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEZhP251bGw6RmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWWI/bnVsbDpZYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEthP251bGw6S2Esd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGtjP251bGw6a2MsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFc/bnVsbDpXfX1jLkNqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuSGwoYSk6W10sYzt0aGlzLmhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLmdoPSEwO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSx0aGlzLkdoKGMpfWVsc2UgZm9yKGUgaW4gdGhpcy5jZil7aWYodGhpcy5maClicmVhaztjPXRoaXMuY2ZbZV07dGhpcy54ZihjKSYmKHRoaXMuemQucHVzaChjKSx0aGlzLkdoKGMpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sSGw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZTtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8CmEubGVuZ3RoO2YrKyllPWFbZl0sZT10aGlzLmNmW2VdLHRoaXMueGYoZSkmJmMucHVzaChlKTtyZXR1cm4gY30sR2g6ZnVuY3Rpb24oYSl7dGhpcy54ZihhKSYmYS5mKCl9LFRuOmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBxJiYhdGhpcy5naClmb3IodGhpcy5maD0hMCxhPTA7YTx0aGlzLnpkLmxlbmd0aDthKyspdGhpcy56ZFthXS5MYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpkW2FdLkxiKX19fSkoYyk7dmFyIG1jPWMuQ2p8fG1jLE09bmV3IG1jO00uZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIG5jPWMuVGt8fG5jO25ldyBuYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxmLnpjKGsucm8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLnpjKGsuSm0pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTsKdmFyIHNjPUQuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscWM9RC5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRCk7dmFyIEk9bmV3IEosbT0hMTtJLmdhKCk7SS5aZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuZ2EoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLlpnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS5nYSgpO3ZhciB0Yz1zYyhmdW5jdGlvbigpe2Yuemcod2luZG93LEkuY20oKSx7aWQ6dGN9KX0sNTAwKSxpYT1mLlcoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmhsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgb2M9Yy5obHx8b2M7bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy52aD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMudWQ9MDt0aGlzLiRhPSIiO3RoaXMuQWQ9W107dGhpcy5CZD0wO3RoaXMueGg9ITE7dGhpcy4kZT1bXTtmLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5zaT1hO2EucHJvdG90eXBlPXtBbjpmdW5jdGlvbihhKXt0aGlzLnZoPWF9LGpmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sdm46ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSx1bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy4kYV1bYV0pO3JldHVybiBjfSxOYzpmdW5jdGlvbihhLGMpe2YuWSgid2VsdC5kZSIpJiYKZi5aYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5sYik7dmFyIGU9ITEsZz0hMTtpZih0aGlzLmRtKCkpdGhpcy5sYi5nKHRoaXMubGIucWQsdGhpcy5sYi51YSx0aGlzLmxiLmJmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubGIueWMpO2Vsc2UgaWYodGhpcy5TbCgpKXRoaXMucm4oZnVuY3Rpb24oKXt0aGlzLk5jKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtmLm8oay53Yyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPQp0aGlzLmNvbmYsbD1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTtjJiZsLlZuKCk7bC5leGl0RnVsbHNjcmVlbigpO2Yub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUWEobCx0aGlzLmxiLGgpO2wudG4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkFtKGEpKXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihlPXRoaXMucGxheWVyLkplKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsZSxnKTt0aGlzLnBsYXllci5JaChsKX19LGRtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMudWQpcmV0dXJuIGM9CmEuZ2V0VGltZSgpLXRoaXMudWQuZ2V0VGltZSgpLHRoaXMudWQ9YSwzRTU8Yz8hMDohMTt0aGlzLnVkPWE7cmV0dXJuITF9LEtuOmZ1bmN0aW9uKCl7Zi5vYigicHJlcm9sbCIpO2YuaGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfSxKbjpmdW5jdGlvbihhKXtpZighdGhpcy52aCl7Zi5oZigicG9zdHJvbGwiKTtmLm9iKCJwb3N0cm9sbCIpO3RoaXMuQW4oITApO3ZhciBjPXRoaXMuY29uZixlPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoZT10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOwooZT10aGlzLnZnKGUpKT90aGlzLk5jKGUsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLmdkLHRoaXMucGxheWVyLmwoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LGhuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSG4odGhpcy5Kbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxGZDpmdW5jdGlvbihhKXtmLm9iKCJtaWRyb2xsIik7Zi5oZigibWlkcm9sbCIpO2lmKCF0aGlzLmxoKXt0aGlzLmxoPSEwO3ZhciBjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLk5jKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoPQohMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay5nZCx0aGlzLnBsYXllci5sKCkpKX19LGduOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuem4odGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LbigpO3RoaXMucGxheWVyLk9lJiZ0aGlzLmduKCk7dGhpcy5obigpfSxqbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxkKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5UbyhhLGIsYyxkLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLAphW2NdLm1hY3JvKX10aGlzLkJkPXRoaXMuQWQubGVuZ3RofSxTbDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxybjpmdW5jdGlvbihhKXt0aGlzLnhoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuWG0uYmluZCh0aGlzKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLiRlLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy54aCgpfSxBbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZT0wO2U8dGhpcy4kZS5sZW5ndGg7ZSsrKWM9dGhpcy4kZVtlXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy5zaXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYz1jLlZvfHxwYztuZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKFdhZW5naWVyb05vb2Rvb3QsV2FlbmdpZXJvTm9vZG9vdCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.116.20
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.20.116.4.46.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 2238
|
0
0
|
15ms
15ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?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.167.1 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame A577
|
0
0
|
6ms
6ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb95.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.4.15
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
b63.s79.research.de.com/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
78.46.46.82
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
85ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=df95007b-20b7-f7eb-5b61-3032a9ef8474&tv={c:tyiB7W,pingTime:5,time:5032,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5032,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5027~100],as:[5027~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:175,fm:rHpa2Q8+11|12|1311|1312|1313|14|151|16|17|18|1911|1a|1b|1c|1d|1e*.346702-39754020|1f|1g,idMap:1e*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
8ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
POST
H2
|
204
|
perf
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
275 B
|
17ms
16ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|